版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第2章51单片机的指令系统概述计算机通过执行程序完成人们指定的任务,程序由一条一条指令构成,能为CPU识别并执行的指令的集合就是该CPU的指令系统。以助记符表示的指令是计算机的汇编语言,使用汇编语言编写的程序称为汇编语言程序。汇编指令与机器指令一一对应。MCS-51单片机汇编语言指令格式:
操作符目的操作数,源操作数操作符指明该指令完成什么操作;操作数是指明该指令的操作对象。目的操作数是存放结果的。指令中操作数提供的方式称为寻址方式。2.1寻址方式指令的操作对象是操作数,而操作数可以是立即数或存放立即数的地址,寻址方式就是寻找立即数的地址。51单片机的指令系统有7种寻址方式。1、立即寻址指令中直接给出操作数的寻址方式。在51系列单片机的指令系统中,立即数用一个前面加“#“号的8位数(#data,如#30H)或16位数(#data16,如#2052H)表示。立即寻址中的数,称为立即数。 【例2-1】MOVA,#80H2、直接寻址操作数的地址直接出现在指令中。
【例2-2】MOVA,25h ;假设(25h)=55h
执行完A=55h MOVP0,#45h注意:
在指令中,立即数以#开头,地址直接给出;但是,在注释时我们习惯上,立即数直接写出,地址加括号。3、寄存器寻址操作数存放在寄存器中。
【例2-3】MOVA,R0 ;假设R0=3Ah
执行完A=3Ah注意:movP0,#45h中的P0不是寄存器寻址,特殊功能寄存器不是真正的寄存器,只是符号地址,只有A,B,R0~R7,DPTR是真正的寄存器,初学者大致了解,不必深究。比如:movA,#12h ;寄存器寻址
mov0E0h,#12h ;直接寻址,E0h是A的地址
movACC,#12h ;直接寻址,ACC是的符号地址, 即E0h
第二条指令和第三条指令是相同指令4、寄存器间接寻址操作数存放在以寄存器内容为地址的单元中。
【例2-4】MOV@R0,A ;假设R0=3Ah,A=55h
执行完(3Ah)=55h
特别注意的是,间址寄存器只能用R0、R1或者DPTR。5、变址寻址变址寻址只用于访问程序存储器。它是以DPTR或PC作基址寄存器,以累加器A作变址寄存器,并以两者内容相加形成的16位地址作为操作数地址,以达到访问操作数的目的。
MOVCA,@A+DPTR
MOVCA,@A+PC关于数据指针(DPTR):数据指针为16位寄存器,它是51单片机中唯一一个供用户使用的16位寄存器,寻址范围为64K。DPTR由两个8位普通寄存器组成,分别为DPH(高8位)和DPL(低8位),一般用于片外RAM的寻址访问。6、相对寻址以当前程序计数器PC的内容为基值,加上指令给出的一字节补码数(偏移量)形成新的PC值的寻址方式为相对寻址。相对寻址是为了解决程序转移而专门设置的。
如:sjmp08h;PC=PC+8(当前PC=?),跳转到PC+0A地址
;运行7、位寻址对片内RAM中20H~2FH中的128个位地址及SFR中的可位寻址的位地址进行操作。
【例2-6】MOV32h,C
或
MOV26h.2,C2.2数据传送和交换指令
2.2.1传送类指令1.内部RAM数据传送指令:完成寄存器、累加器、RAM单元以及专用寄存器之间(包括立即数)的相互数据传送。 格式如下:
mov<目的操作数>,<源操作数>
将源操作数复制到目的操作数。⑴以A为目的操作数 【例2-7】
movA,Rn ;如movA,R7 movA,dir ;如movA,20h movA,@Ri ;如movA,@R0 movA,#data ;如movA,#55h注意:Rn中的n可以为0~7,Ri中的i可以为0~1⑵以Rn为目的操作数 【例2-8】
movRn,A ;如movR5,A movRn,dir ;如movR7,40h movRn,#data ;如movR2,#30h⑶以DPTR为目的操作数 【例2-9】
movDPTR,#data16 ;如movDPTR,#0A123h
与下面两条指令效果相同 movDPL,#data8 ;如movDPL,#23h movDPH,#data8 ;如movDPH,#0A1h(4)以直接地址为目的操作数 【例2-10】
movdir,A ;如mov30h,A movdir,Rn ;如mov30h,R6 movdir,dir ;如mov20h,40h movdir,@Ri ;如mov20h,@R1 movdir,#data ;如mov50h,#23h(5)以间接地址为目的操作数 【例2-11】
mov@Ri,A ;如mov@R0,A
mov@Ri,dir ;如mov@R1,30h
mov@Ri,#data ;如mov@R0,#40h
dir@Ri
Rn#dataA2.外部RAM数据传送指令
movxA,@Ri ;i=0或1
movxA,@DPTR
movx@Ri,A
movx@DPTR,A3.程序存储器数据传送指令
movcA,@A+DPTR
movcA,@A+PC
注意:数据传送指令不影响程序状态字PSW。
在C语言中,赋值运算符“=”例子要求:向端口P1写55H汇编语言 org0000h
ljmpStart org0030h
Start:
movP1,#55h
sjmp$
endC语言#include<reg51.h>main()
{
P1=0x55;
while(1);
}查看反汇编例子已知内部RAM中,(30h)=40h,(40h)=50h,(50h)=5Ah,试分析下段程序执行后,A=
,R0=
,(30h)=
,(40h)=
,(50h)=
。 mov A,#50h mov R0,A mov @R0,30h 4.堆栈操作
堆栈是一种数据结构,所谓堆栈就是只允许在其一端进行数据插入和数据删除操作的线性表。数据写入堆栈称为入栈。数据从堆栈中读出称为出栈。堆栈的最大特点就是“后进先出”,LIFO(Last-InFirst-Out)。⑴堆栈的功能堆栈主要是为子程序调用和中断操作而设立的。其具体功能有两个:保护断点和保护现场。此外,堆栈也可用于数据的临时存放。⑵堆栈的开辟堆栈只能开辟在芯片的内部数据存储器中,方法就是在程序初始化时,将堆栈指针(专用寄存器SP)指向栈底减1。⑶关于堆栈指针SPSP是专用寄存器的一员。系统复位后,SP的内容为07h,在主程序初始化时需要更改,以将堆栈区开辟在内部RAM30h~7Fh区域。SP的内容就是堆栈栈頂的存储单元地址。⑷堆栈的使用方式堆栈的使用有两种方式:一种是自动方式,用于在调用子程序或中断时保存断点和程序返回时恢复断点。另一种是指令方式。⑸堆栈操作指令:有进栈和出栈两条。
pushdirect;sp←sp+1,(sp)←(direct)将内部RAM低128单元或专用寄存器内容送栈頂单元。
popdirect;(direct)←(sp),sp←sp-1
将栈頂单元内容送内部RAM低128单元或专用寄存器。
【教材第34页末例子】××片内RAM50H70h31h30hSP××片内RAM50H70h50H××执行前执行前push70h指令后31hSP30h××片内RAM50H60h31h30hSP××片内RAM50H60h50H××执行前执行前pop60h指令后31hSP30h例子如图为执行push指令前的片内RAM,问执行指令push60h后SP=
,(50h)=
,(51h)=
,(60h)=
。SP60h56h51h34h50h12h4.数据交换指令:将源操作数和目的操作数(A)的整字节或半字节交换。⑴整字节交换指令,共三条指令: 【教材第35例子】
xchA,Rn ;A↔Rn xchA,direct ;A↔(direct) xchA,@Ri ;A↔(Ri)⑵半字节交换指令,只一条指令:
xchdA,@Ri ;A3~0↔(Ri)3~0⑶累加器高低半字节交换指令:
swapA ;A3~0↔A7~42.3算术运算类指令1.加法指令
addA,Rn ;A←A+Rn addA,direct ;A←A+(direct) addA,@Ri ;A←A+(Ri) addA,#data ;A←A+data
注意,加法指令目的操作数必须是累加器A。加法指令对程序状态字PSW的CY、AC和OV有影响。
2.带进位加法指令
addcA,Rn ;A←A+Rn+CY addcA,direct ;A←A+(direct)+CY addcA,@Ri ;A←A+(Ri)+CY addcA,#data ;A←A+data+CY
在C语言中,加法运算符“+”例子计算两个8位数12h+34h=36h,结果由P1端口输出。汇编 程序格式略
movA,#12h
addA,#34h
movP1,AC
unsignedcharx;
x=0x12;
x=x+0x34;
P1=x;例子计算两个16位数1082h+1094h=2116h,结果由P2、P0端口输出。汇编
movA,#82h
addA,#94h
movP0,A
movA,#10h
addcA,#10h
movP2,AC
unsignedintx;
x=0x1082;
x=x+0x1094;
P0=x;
P2=x>>8;3.带借位减法指令
subbA,Rn ;A←A-Rn-CY subbA,direct ;A←A-(direct)-CY subbA,@Ri ;A←A-(Ri)-CY subbA,#data ;A←A-data-CY
注意,减法指令目的操作数必须是累加器A。减法指令对程序状态字PSW的CY、AC和OV有影响。⑴如果位7有借位,则进位标志CY置1,否则CY清0。⑵如果位3有借位,则进位标志AC置1,否则AC清0。
在C语言中,减法运算符“-”例子计算两个8位数34h-12h=21h,结果由P1端口输出。汇编
movA,#34h
clrC
subbA,#12h
movP1,AC
unsignedcharx;
x=0x34;
x=x-0x12;
P1=x;4.加1指令
incA ;A←A+1 incRn ;Rn←Rn+1 incdirect ;(direct)←(direct)+1 inc@Ri ;(Ri)←(Ri)+1 incDPTR ;DPTR←DPTR+1
加1指令不影响程序状态字PSW的状态.5.减1指令
decA ;A←A-1 decRn ;Rn←Rn-1 decdirect ;(direct)←(direct)-1 dec@Ri ;(Ri)←(Ri)-1
减1指令不影响程序状态字PSW的状态.注:decDPTR非法。
在C语言中,自增、自减运算符“++”、“--”例子已知内部RAM中,(30h)=70h,(40h)=90h,(50h)=5Ah,试分析下段程序执行后,A=
,R1=
,(30h)=
,(40h)=
,(50h)=
,C=
。 mov A,#30h
mov R1,A
mov A,40h
add A,@R1
mov 40h,A
dec A
mov 30h,A 6.乘法指令
mulAB ;BA←A*B
该指令将A与B中的两个无符号数相乘,16位的积低位字节在A中,高位字节在B中。乘法指令影响PSW的状态,CY总被清0。如果乘积超过255,OV置1,否则清0。7.乘法指令
divAB ;A/B
该指令将A与B中的两个无符号数相除,商存于A中,余数存于B中。除法指令影响PSW的状态,CY总被清0。如果除数为0,OV置1,否则清0。
在C语言中,乘除运算符“*”,“/”8.十进制调整指令⑴十进制调整问题在MCS-51中没有专门的十进制数(BCD码)的加法指令,只能采用add和addc对十进制数进行加法运算。但是有可能产生错误。⑵十进制调整指令的格式
daA
调整规则:若A低4位>9或AC=1,则A←A+06h;若A高4位>9或CY=1,则A←A+60h;若同时上述两种情况,则A←A+66h;
6+3=98+7=158+9=17011010001000+0011+0111+10011001111110001√××2.3逻辑运算和移位类指令1.逻辑与运算指令
anlA,Rn ;A←A∧Rn anlA,direct ;A←A∧direct anlA,@Ri ;A←A∧(Ri) anlA,#data ;A←A∧data anldirect,A ;A←direct∧A anldirect,#data ;direct←direct∧data2.逻辑或运算指令
orlA,Rn ;A←A∨Rn orlA,direct ;A←A∨direct orlA,@Ri ;A←A∨(Ri) orlA,#data ;A←A∨data orldirect,A ;A←direct∨A orldirect,#data ;direct←direct∨data3.逻辑异或运算指令
xrlA,Rn ;A←A⊕Rn xrlA,direct ;A←A⊕direct xrlA,@Ri ;A←A⊕(Ri) xrlA,#data ;A←A⊕data xrldirect,A ;A←direct⊕A xrldirect,#data;direct←direct⊕data4.累加器清0和取反指令
clrA ;A←0 cplA ;A←A取反
在C语言中,位运算符“&”,“|”,“^”,“~”例子将一个8位数34h的高四位清0,结果由P1端口输出。汇编
movA,#34h
anlA,#0Fh
movP1,AC
unsignedcharx;
x=0x34;
x=x&0x0F;
P1=x;例子已知内部RAM中,(30h)=23h,(40h)=65h,(50h)=5Ah,试分析下段程序执行后,A=
,R0=
,(30h)=
,(40h)=
,(50h)=
。 mov A,#50h
mov R0,A
mov A,40h
anl A,@R0
mov 30h,A
orl A,#0Fh
mov 40h,A
xrl A,#0F0h
mov 50h,A 5.移位指令⑴循环左移
rlA ;An+1←An,A0←A7
该指令具有将A乘2的功能。⑵循环右移
rrA ;An←An+1,A7←A0
该指令具有将A除2的功能。⑶带进位位循环左移
rlcA ;An+1←An,CY←A7,A0←CY⑷带进位位循环右移
rrcA ;An←An+1,A7←CY,CY←A0
注:逻辑指令除了rlc和rrc影响CY以外,其它的一律不影响PSW的状态。
在C语言中,移位运算符“<<”,“>>”AAACYACY例子将一个8位数12h*4,结果由P1端口输出。汇编
movA,#12h
rlA
rlA
movP1,AC
unsignedcharx;
x=0x12;
x=x<<2;
P1=x;例子已知内部RAM中,(30h)=23h,(40h)=65h,(50h)=5Ah,试分析下段程序执行后,(30h)=
,(40h)=
,(50h)=
。 mov A,30h
rl A
mov 30h,A
rl A
mov 40h,A
rl A
mov 50h,A 【教材例2-15】将21H单元的低三位和20H单元中的低五位合并为一个字送30H单元,要求(21H)的低三位放在高位上。
MOV 30H,20H ;(30H)=(20H)
ANL 30H,#1FH ;保留低五位
MOV A,21H ;A=(21H)
SWAPA ;高低四位交换
RL A ;低三位变到高三位位置
ANL A,#0E0H;保留高三位
ORL 30H,A ;和(30H)的低五位合并
SJMP$2.4控制转移指令
2.4.1调用程序和返回类指令子程序是一种重要的程序结构。在一个程序中经常遇到反复多次执行某程序段的情况,对次,可采用子程序结构,通过主程序调用而使用它。1、长调用指令
lcalladdrl16;addr16→PC0~15说明:(1)该指令功能是①保护断点,即当前PC(本指令的下一条指令的首地址)压入堆栈。②子程序的入口地址addr16送PC,转子程序执行。(2)本指令为64KB地址范围内的调子程序指令,子程序可在64KB地址空间的任一处。2、短调用(绝对调用) acalladdr11;addr11→PC0~10说明:(1)该指令的功能是①保护断点,即当前PC压入堆栈。②addrl11→PC0~10,而PC11~15保持原值不变。(2)本指令为2KB地址范围的调子程序指令,子程序入口距当前PC不得超过2KB地址范围。3、子程序返回指令 ret ;从调用子程序返回。功能:从栈顶弹出断点到PC。 reti ;从中断服务程序返回。功能:从栈顶弹出断点到PC,并恢复中断优先级状态触发器。
关于中断服务程序返回指令以后再说。
在C语言中,子程序在C语言中表现为函数例子: main() sub()
{ { … … sub(); } … }例子定义两个子程序,由主程序调用,一个子程序向P2输出55h,一个子程序向P0输出AAh汇编
lcallSub1
lcallSub2
sjmp$Sub1:
movP2,#55h
retSub2:
movP0,#0AAh
ret C
Sub1()
{P2=0x55;
} Sub2()
{P0=0xAA;
} main()
{Sub1();
Sub2();
while(1);
}2.4.2转移指令程序的顺序执行是由PC自动加1实现的。要改变程序的执行顺序,实现分支转向,应通过强迫改变PC值的方法来实现,这就是控制转移类指令的基本功能。共有两类指令:无条件转移和有条件转移。子程序调用也是通过改变PC实现的,只是子程序调用需要返回,转移指令不需要返回。1.无条件转移指令
MCS-51共有四条无条件转移指令:(1)短转移
ajmpaddr11;addr11→PC0~10说明:转移范围:本指令为2KB地址范围内的转移指令。对转移目的地址的要求与ACALL指令对子程序入口地址的要求相同。(2)长转移 ljmpaddr16;addr16→PC0~15说明:本指令为64KB程序存储空间的全范围转移指令。转移地址可为16位地址中的任意值。(3)间接转移
jmp@A+DPTR;A+DPTR→PC例A=02H,DPTR=2000H,指令JMP@A+DPTR执行后,PC=2002H。也就是说,程序转移到2002H地址单元去执行(4)无条件相对转移(短转移)
sjmprel;PC+rel→PC, 即As+2+rel→PC说明:
As为源地址(本指令的首地址),该指令为2字节指令,执行本指令时当前PC=As+2,
rel为转移的偏移量,转移可以向前转(目的地址小于源地址),也可以向后转(目的地址大于源地址),因此偏移量rel是1字节有符号数,用补码表示(-128~+127),所以指令转移范围在离源地址As的-126~+129字节之间。
在C语言中,“goto”例子无条件跳转到标号为Label处汇编
ljmpLabel
ajmpLabel
sjmpLabel
C
gotoLabel;2.条件转移指令组所谓条件转移指令就是程序转移是有条件的。规则是,执行条件转移指令时,如指令中规定的条件满足,则进行程序转移,否则程序顺序执行。注意,条件转移指令所采用的寻址方式都是相对寻址方式,计算方法同sjmp指令。⑴累加器判零转移指令
jzrel ;ifA=0jump,elsenext jnzrel ;ifA≠0jump,elsenext⑵减1条件转移指令
djnzRn,rel ;Rn←Rn-1,ifRn!=0jump,elsenext djnzdirect,rel ;(direct)←(direct)-1,if(direct)!=0jump,elsenext⑶数值比较转移指令
cjneA,#data,rel ;ifA!=datajump,elsenext cjneA,direct,rel ;ifA!=(direct)jump,elsenext cjneRn,#data,rel ;ifRn!=datajump,elsenext cjne@Ri,#data,rel ;if(Ri)!=datajump,elsenext
⑷以C状态为条件的转移指令 (教材第45页)
jcrel ;ifC=1jump,elsenext jncrel ;ifC=0jump,elsenext⑸以位状态为条件的转移指令
jbbit,rel ;if(bit)=1jump,elsenext jnbbit,rel ;if(bit)=0jump,elsenext jbcbit,rel ;if(bit)=1jumpand(bit)←0,elsenext
在C语言中,无条件转移“goto”有条件转移
ifelse 分支一
switchcase 分支二
for() 循环一
while() 循环二
do while() 循环三分支程序例子实现下列计算:
并由P1端口输出开始X=5?NYP1=0X>5?NYP1=1结束汇编
movA,#5
cjneA,#5,NotEqual
movP1,#0
sjmpExit
NotEqual:
clrC
subbA,#5
jncbigger
sjmpExit
bigger:
movP1,#1
Exit: C
unsignedcharx;
x=5;
if(x==5)P1=0;
elseif(x>5)P1=1;循环程序例子实现下列计算1+2+3+4+5+6+7+8+9+10,
并由P1端口输出开始Sum=0,i=10Sum=Sum+ii减1YX=0?NP1=Sum结束循环程序例子汇编
clrA
movR0,#10
Loop:
addA,R0
djnzR0,Loop
movP1,A C
unsignedchari,sum;
i=10;
sum=0;
do
{
sum=sum+i;
i--;
}
while(i);
P1=sum;例子已知内部RAM中,(30h)=23h,(40h)=65h,试分析下段程序执行后,P1=
。 mov A,30h
clr C
subb A,40h
jc Label
mov P1,#55h
sjmp Exit
Label:
mov P1,#0AAh
Exit: 【例2-28】将A累加器的低四位取反四次、高四位不变。每变换一次,从P1输出。方法1:加1计数: MOVR0,#0 ;计数初值送0LL: XRLA,#0FH ;高4位不变,低四位取反
INCR0 ;次数加1 MOVP1,A ;从P1输出
CJNER0,#04,LL ;不满四次循环
RET方法2:减1计数: MOVR0,#04H;计数初值送4LL: XRLA,#0FH MOVP1,A DJNZR0,LL;次数减1不等于0循环
RET2.4.3空操作指令
nop该指令经取指,译码后不进行任何操作(空操作)而转到下一条指令,常用于生产一个机器周期的延时。2.5
位操作指令所谓位处理,就是以位为单位进行的运算和操作。位操作的对象是内部RAM位寻址区的128个可寻址位和专用寄存器的可寻址位。位累加器采用进位位CY。在程序中位地址的表达有多种方式:1)用直接位地址表示,如D4H。2)用“·”操作符号表示,如PSW.4,或D0H.43)用位名称表示,如RS11.位清零、位置1
CLR C ;0→CY
CLR bit ;0→bit SETB C ;1→CY SETB bit ;1→bit3.位传送
MOVC,bit ;bit→CY MOVbit,C ;CY→bit
在C语言中,赋值运算符“=”2.位与、位或、取反
ANLC,bit ;CY∧(bit)→CY
ANLC,/bit ;CY∧(/bit)→CY
ORLC,bit ;CY∨(bit)→CY
ORLC,/bit ;CY∨(/bit)→CY CPL C ;CY取反 CPL bit ;bit取反
在C语言中,位运算符“&”、“|”、“~”例子将P1端口的引脚0置1,引脚1清0,引脚2取反汇编
setbP1.0
clrP1.1
cplP1.2 C
sbitx=P1^0;
sbity=P1^1;
sbitz=P1^2; x=1;
y=0;
z=~z;MCS-51汇编语言程序设计
无论哪一种嵌入式系统,都有两种编程语言---汇编语言和高级语言(一般为C语言)。汇编语言产生的目标程序简短,占用存储空间小,执行快,能充分发挥计算机的硬件功能。无论是高级语言还是汇编语言,源程序都要转换成目标程序(机器语言)单片机才能执行;高级语言编程快捷,但程序长,占用存储空间大,执行慢。
无论是高级语言还是汇编语言,源程序都要转换成目标程序(机器语言),经Keil编译后的51目标程序为HEX文件格式。参考教材第3章单片机汇编语言概述单片机汇编语言就是单片机汇编指令的集合,其采用了助记符的形式来描述指令。优点:程序代码精炼,执行速度快;每条指令的执行时间确定,特别适合于对时序要求比较高的场合;占用内存单元和CPU资源比较少;和硬件结构和资源密切相关,对于理解单片机的运行和组成很有帮助。缺点:指令和具体的硬件密切相关,缺乏通用性;采用助记符描述的指令还是不够清晰,代码比较难懂;使用汇编语言编写程序时,必须熟悉单片机的指令系统、寻址方式、寄存器的设置和使用方法,以及系统的硬件资源等。分散了开发人员用于程序结构和功能上的精力;MCS-51汇编语言由四部分组成,格式如下:
[标号:]<操作码>,[操作数][;注释]
标号是指令的符号地址,有关标号的规定如下:①标号头一个字符必须是字母;②不能使用本汇编语言已经定义了的符号作为标号;③标号后边必须跟以冒号(:);④同一个标号在一个程序中只能定义一次,不能重复定义。注释用“;”开头,对语句解释说明。伪指令伪指令,顾名思义,并不是真正的单片机指令。伪指令仅为单片机汇编程序提供某种标记信息,但却是程序中不可缺少的部分。伪指令与单片机指令的区别如下:伪指令不能命令CPU执行某种操作,也没有对应的机器代码。单片机指令能使单片机的CPU执行某种操作,并可以生成对应的机器代码。起始伪指令ORG起始伪指令ORG用于标记一个汇编语言程序的开始。这里,16位地址便是汇编程序块或数据块存放的起始地址。如果省略ORG伪指令,则单片机程序代码将默认从0000H单元开始存放。[标号:] ORG 16位地址使用格式结束伪指令END结束伪指令END用于标记一个汇编语言程序的结束。这里,标号和表达式都可以省略。在汇编语言程序执行时,END之后所写的任何指令都不予以处理。一个程序只能有一个END伪指令。[标号:] END [表达式]使用格式两个最常用的伪指令
(1)ORG:汇编起始地址用来说明其后一段程序在存储器中存放的起始地址。(2)END:汇编结束 org0000h
ljmpStart org0030h
Start:
movP1,#55h
;端口P1写55h
sjmp$
end注:汇编语言很有用,但初学者不要深究等值伪指令EQU等值伪指令EQU相当于重命名的概念,其采用一个规定的字符名称来代替一个数或特定的汇编符号。使用伪指令EQU时必须先赋值,后使用,而不能先使用后赋值。另外,给字符名称所赋的值可以是8位数,也可以是16位数。用EQU定义的字符名称不能和汇编语言的关键字同名。字符名称 EQU 数据或汇编符号或者字符名称 = 数据或汇编符号使用格式地址赋值伪指令DATA地址赋值伪指令DATA是用指定的字符名称来代替数据地址或代码地址。DATA伪指令在程序中常用来定义数据地址。就功能上来说,伪指令DATA与EQU有些类似。区别如下:EQU伪指令必须先定义后使用,而DATA伪指令则无此限制;EQU伪指令可以把一个汇编符号赋给一个字符名称,而DATA伪指令则不能;DATA伪指令可将一个表达式的值赋给一个字符变量,所定义的字符变量也可以出现在表达式中,而EQU定义的字符则不能这样使用。字符名称 DATA 表达式字节保存伪指令DB字节保存伪指令DB用于在单片机内存中保存数据表,只能对程序存储器进行操作。其中,8位字节数据表可以是一个或多个字节数据、字符串或表达式。在数据表中,各项数据用“,”分隔,一个数据项占一个存储单元。所有的数据项是从标号指定的地址单元开始,将数据表中的字节数据按顺序依次保存。数据项可以采用十进制、二进制或者十六进制表示。[标号:] DB 8位字节数据表字保存伪指令DW字保存伪指令DW用于在单片机内存中保存双字节数据表,只能对程序存储器进行操作。其中,16位字数据表可以是一个或多个字节数据、字符串或表达式。在数据表中,各项数据用“,”分隔,一个数据项占一个存储单元。所有的数据项是从标号指定的地址单元开始,将数据表中的字节数据按顺序依次保存。16位数据要占用两个单元的存储器,高8位数据存入低地址字节,低8位数据存入高地址字节。[标号:] ORG 16位地址空间预留伪指令DS空间预留伪指令DS用于在单片机内存中划分出一定的存储空间用作备用区域,只能对程序存储器进行操作。这里,表达式表示了从标号指定的地址单元开始,保留存储单元的个数。[标号:] DS 表达式位变量伪指令BIT位变量伪指令BIT用于给位地址定义一个字符名称。其中,位地址需要参考单片机中的定义,字符名称就是位变量。字符名称 BIT 位地址单片机汇编语言的程序结构程序结构就是程序指令的组织方式。单片机汇编语言程序大致可以分为5种程序结构:顺序结构分支结构循环结构子程序结构查表结构顺序结构顺序结构程序是按照指令的书写顺序来执行的程序结构,相当于人们在作事情时,严格按照一个计划表来执行。顺序结构是一种无分支的直线型程序结构,一种最简单、最基本的程序。在该程序中,单字节十六进制数据在0~255之间,存放在单片机RAM的32H中。首先将其除100后,商为百位数,余数除以10,商为十位数,余数为个位数。程序转换后,百位数存放于R5中,十位和个位分别存放于R6的高位和低位字节中。顺序结构01 ORG 0200H ;汇编程序起始指令02 MOV A, 32H ;将单字节数据存入累加器A中03 MOV B, #100 ;分离出百位数04 DIV AB05 MOV R5, A ;百位数送入寄存器R506 XCH A, B ;余数存入累加器A中07 MOV B, #10 ;分离出十位和个位08 DIV AB09 SWAP A ;十位存入高字节10 ADD A, B ;低位存入低字节中11 MOV R6, A12 END ;汇编程序结束命令分支结构分支结构是一种判断形式的程序结构,相当于人们在作事情时,根据判断的结果来觉得后面做那件事。分支结构的程序判断条件的满足与否,产生一个或多个程序分支,以实现不同的程序走向。分支结构按照采用指令的不同而分为两类:双分支结构。这类分支结构主要采用有条件转移指令JC、JB等,比较条件转移指令CJNE等和累加器A判断指令JZ等。当给定的条件成立时,执行分支程序1,否则执行分支程序2。多分支结构。这类结构主要采用散转指令JMP,根据运算的结果指在多个分支中选择一个执行的程序结构。分支结构示例01 ORG 0200H ;汇编程序起始命令02 MOV A,R4 ;低字节送入累加器A03 CPL A ;取反04 ADD A,#01H ;加105 MOV 22H,A ;将结果送入地址22H06 JZ ZERO ;如果A的值为零则转向ZERO07 MOV A,R3 ;高字节送入累加器A08 CPL A ;取反09 MOV 21H,A ;将结果送入地址21H10 SJMP FEND ;转结束11 ZERO: MOV A,R3 ;高字节送入累加器A12 CPL A ;取反13 INC A ;加一14 MOV 21H,A ;将结果送入地址21H15 FEND:16 END ;程序结束循环结构循环结构是一种重复执行某段代码的程序结构,相当于人们在作事情时,在一段时间内进行重复性的工作。一个典型的循环程序由4部分组成,即循环初始化部分、循环处理部分、循环控制部分和循环结束部分。初始化部分:主要用于设置循环的次数、有关的工作单元清零、变量设置和地址指针设置等循环初始参数。循环处理部分:也称为循环体,这是循环结构的主要代码段,在程序运行时将重复执行。循环次数控制部分:主要用于控制循环的次数,防止出现死循环。循环次数控制部分一般由两个单元组成,修改控制变量和判断循环结束。循环控制变量可以采用循环递减计数法,即每循环一次,控制变量减1,并判断是否为0,若不为0,则继续执行循环体程序,否则结束循环体的执行;也可以采用条件控制,即判断结束条件是否成立,如果不成立,则继续执行循环体,否则,结束循环。结束部分:当循环处理部分执行完毕后,需要对计算结果进行处理和保存,已供后面的程序使用。循环转移指令
在51系列单片机的指令系统中,提供了如下两条循环转移指令:DJNZRn,LOOP:这里采用工作寄存器Rn为控制寄存器。控制寄存器的计数方式一般都是减1计数,即每循环一次,Rn自动减1计数,同时判断寄存器Rn是否为0,若不为0,继续执行循环;若为0,则结束循环程序的执行。DJNZDirect,LOOP:这里采用直接寻址单元Direct作为控制寄存器。控制寄存器的计数方式一般都是减1计数,即每循环一次,Direct单元自动减1计数,同时判断Direct单元是否为0,若不为0,继续执行循环;若为0,则结束循环程序的执行。循环结构示例在程序中,采用了比较和交换的方法来依次对比各个数据。数据块的首地址为10H,先读取第一个数据与第二个数据,把第一个数据作为基准送入累加器A,进行比较。如果基准数大,则不作交换,再取下一个数进行比较;如果基准数小,则将数值大的取代原来的基准数,即相当于做一次数据交换。然后,再以新的基准数与下一个数进行比较,直至全部比较完毕。这里的基准数始终保持为最大的数值,因此,全部比较完毕后,累加器A中的基准数即是数据块中的最大值。最后将最大值保存在通用寄存器R2中。01 ORG 0200H02 MOV R0,#10H ;数据块首地址送入R003 MOV A,@R0 ;取第一个数作为基准数送入累加器A04 MOV R1,#0AH ;比较次数10=0AH送入R105 LOOP1: INC R0 ;修改地址指针,使其指向下一个地址单元06 MOV 20H,@R0 ;将要比较的数暂存于20H单元07 CJNE A,20H,CHK ;两个数进行比较08 CHK: JNC LOOP2 ;如果A大,则转换09 MOV A,@R0 ;如果A小,则将较大的数送入A10 LOOP2: DJNZ R1,LOOP1 ;R1减1,如果其不为0,则继续循环11 MOV R2,A ;比较完毕,存结果12 END子程序结构子程序结构是一种模块化的程序设计思想,其将某些运算和操作设计成可被其他程序调用的子程序段,需要的时候直接调用这些程序段即可。一般来说,调用子程序的程序称为主程序,调用子程序的过程称为子程序调用。子程序执行完后返回主程序的过程称为子程序
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 人事个人工作计划5篇
- 防溺水的讲话稿8篇
- 水电工年度工作总结
- 2024年国开电大【本科】《个人理财》形考任务1234(含答案)
- DB31-T 1396-2023 风机系统运行能效评估技术规范
- 兰亭集序、滕王阁序、赤壁赋比较阅读
- 金融事业说明会
- 公路土工试验规程(JTG-E40-2007)
- 《矛盾定义新课教学》课件
- 《用电检查与稽查》课件
- 会计人员年终个人工作总结(4篇)
- 亨利爱帮忙 绘本课件
- 2023版思想道德与法治专题4 继承优良传统 弘扬中国精神 第2讲 做新时代的忠诚爱国者
- 上海证券交易所董事会秘书资格考试题库和答案-完整版
- 大秦线更换道岔工程施工组织设计
- 建设工程造价咨询报告参考模板
- 2022年公务员多省联考《申论》题(河南县级卷)
- 机电控制及可编程序控制器技术课程设计1
- GB/T 9386-2008计算机软件测试文档编制规范
- GB/T 15596-2009塑料在玻璃下日光、自然气候或实验室光源暴露后颜色和性能变化的测定
- 心理护理在临床护理在临床护理中的重要性
评论
0/150
提交评论