2022年汇编指令详解[参 .pdf
第 4 章 51 汇编指令详解1.指令的定义指令是规定计算机进行某种操作的指令。一条指令只能完成有限的功能,为了使计算机完成一定的或者复杂的功能,就需要一系列指令。计算机能够执行各种指令的集合称为“指令系统”。计算机的主要功能也是由指令系统来体现的。80C51使用了 7 种寻址方式,共有111条指令。如果按照字节分:49条单字节,46 条双字节,16 条 3 字节。如果按照运算速度分:单周期指令 64 条,双周期 45 条,4 周期 2 条。用助记符形式来表示的机器指令称为“汇编语言指令”。计算机的指令一般用汇编语言指令来表示。80C51系列单片机的指令共有111 条指令,按照其功能特点分为5 大类,即是:数据传送指令类、算术运算类、逻辑运算类、控制转移类和位操作类。名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 25 页 -符号定义表符号含义RnR0 R7寄存器 n=07 Direct 直接地址,内部数据区的地址RAM(00H 7FH)SFR(80H FFH)B,ACC,PSW,IP,P3,IE,P2,SCON,P1,TCON,P0 Ri 间接地址 Ri=R0或R18051/31RAM 地址(00H7FH)8052/32RAM地址(00HFFH)#data8 位常数#data1616 位常数Addr1616 位的目标地址Addr1111 位的目标地址Rel 相关地址bit 内部数据 RAM(20H 2FH),特殊功能寄存器的直接地址的位指令介绍指令字节 周期 动作说明一、算数运算指令2.指令的详解(字节周期)1ADD A,Rn11 将累加 8 器与寄存器的内容相加,结果存回累加名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 25 页 -器2ADD A,direct21 将累加器与直接地址的内容相加,结果存回累加器3ADD A,Ri11 将累加器与间接地址的内容相加,结果存回累加器4ADD A,#data21 将累加器与常数相加,结果存回累加器5ADDC A,Rn11 将累加器与寄存器的内容及进位C相加,结果存回累加器6ADDC A,direct21 将累加器与直接地址的内容及进位C相加,结果存回累加器7ADDC A,Ri11 将累加器与间接地址的内容及进位C相加,结果存回累加器8ADDC A,#data21 将累加器与常数及进位C相加,结果存回累加器/减法指令,如下,都是带借位减法,其中 A为被减数,即 A-Rn-CY=A 9SUBB A,Rn 11 将累加器的值减去寄存器的值减借位C,结果存回累加器10SUBB A,direct21 将累加器的值减直接地址的值减借位C,结果存回累加器11SUBB A,Ri11 将累加器的值减间接地址的值减借位C,结名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 25 页 -果存回累加器12SUBB A,#data21 将累加器的值减常数值减借位C,结果存回累加器/INC 将操作数所在指定单元内容加一,其中操作除了第一条13指令影响就标志为外,其余指令操作均不影响PSW 13INC A11 将累加器的值加1;14INC Rn11 将寄存器的值加l 15INC direct21 将直接地址的内容加1 16INC Ri11 将间接地址的内容加1 17 INC DPTR11 数据指针寄存器值加1 说明:将16 位的DPTR加1,当DPTR 的低字节(DPL)从FFH溢出至00H时,会使高字节(DPH)加 1,不影响任何标志位,此是唯一一条 16 位加一指令,如果低 8 位有进位,可以直接向高位进位。/假发指令与假发指令类似,是将其操作数所指定的调用内容减一。18DEC A 1 1 将累加器的值减1 19DEC Rn 1 1 将寄存器的值减1 20DEC direct 21 将直接地址的内容减1 21DEC Ri 1 1 将间接地址的内容减1 名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 25 页 -/乘除法指令都是 1 个字节,4 个周期22MUL AB 1 4 将累加器的值与B寄存器的值相乘,乘积的低位字节存回累加器,高位字节存回,注意AB中间没有空格。B寄存器说明:将累加器A和寄存器B内的无符号整数相乘,产生16 位的积,低位字节存入A,高位字节存入B寄存器。如果积大于FFH,则溢出标志位(OV)被设定为1,而进位标志位为0 23DIV AB 1 4 将累加器的值除以B寄存器的值,结果的商存回累加器,余数存回B寄存器说明:无符号的除法运算,将累加器A除以B寄存器的值,商存入A,余数存入B。执行本指令后,进位位(C)及溢出位(OV)被清除为024 DA A 11 将累加器A作十进制调整,若(A)3-09 或(AC)=1,则(A)3-0(A)3-0+6 若(A)7-49 或(C)=1,则(A)7-4(A)7-4+6二、逻辑运算指令/汇编指令中的十进制调整指令:/这条指令在进行 BCD 码加减法运算时,跟在 ADD 和 ADDC 指令之后,用来对压缩 BCD 码就行结果自动修正,使其仍然为压缩BCD 码。在80C51单片机中,DA A不能对减法指令结果进行修正。名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 25 页 -/该指令是针对十进制的运算结果进行调整的,其实现的功能如下*当低 4 位 A0A39或者半进位位 AC=1 时,自动执行(A)+6-A*当结果的高四位 A4-A79或者进位位 CY=1 时,自动执行(A)+60H-A*当结果的高四位 A4-A79,低 4 位 A0A39时,自动执行(A)+66H-A/这种操作主要用于两个数安位进行逻辑操作,操作结果送至累加器A或者直接寻址单元。主要逻辑操作有“与”,“或”,“非”,以及位移、取反、清除等。25ANL A,Rn 11 将累加器的值与寄存器的值做AND 的逻辑判断,结果存回累加器26ANL A,direct 2 1 将累加器的值与直接地址的内容做AND的逻辑判断,结果存回累加器27ANL A,Ri 11 将累加器的值与间接地址的内容做AND 的逻辑判断,结果存回累加器28ANL A,#data 21 将累加器的值与常数做AND的逻辑判断,结果存回累加器29ANL direct,A2 1 将直接地址的内容与累加器的值做AND的逻辑判断,结果存回该直接地址30ANL direct,#data3 2 将直接地址的内容与常数值做AND的逻辑判断,结果存回该直接地址名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 25 页 -/29,30两条指令,如果direct为 I/O 口,则进行“读-改-写”操作。/逻辑或操作,31 ORL A,Rn 11 将累加器的值与寄存器的值做OR 的逻辑判断,结果存回累加器32ORL A,direct2 1 将累加器的值与直接地址的内容做OR的逻辑判断,结果存回累加器33ORL A,Ri 1 1 将累加器的值与间接地址的内容做OR的逻辑判断,结果存回累加器34ORL A,#data2 1 将累加器的值与常数做OR的逻辑判断,结果存回累加器35ORL direct,A2 1 将直接地址的内容与累加器的值做OR的逻辑判断,结果存回该直接地址36ORL direct,#data 32 将直接地址的内容与常数值做OR的逻辑判断,结果存回该直接地址/逻辑异或操作37XRL A,Rn 11 将累加器的值与寄存器的值做XOR 的逻辑判断,结果存回累加器名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 25 页 -38XRL A,direct2 1 将累加器的值与直接地址的内容做XOR 的逻辑判断,结果存回累加器39XRL A,Ri 1 1 将累加器的值与间接地扯的内容做XOR 的逻辑判断,结果存回累加器40 XRL A,#data2 1 将累加器的值与常数作XOR 的逻辑判断,结果存回累加器41XRL direct,A2 1 将直接地址的内容与累加器的值做XOR 的逻辑判断,结果存回该直接地址42XRL direct,#data 32 将直接地址的内容与常数的值做XOR 的逻辑判断,结果存回该直接地址43CLR A 1 1 清除累加器的值为0 44CPL A 1 1 将累加器的值反相/RL,RR 循环移位指令,RRC,RLC 带进位循环以移位指令45RL A 1 1 将累加器的值左移一位46RLCA 1 1 将累加器含进位C 左移一位名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 25 页 -47RRA 11 将累加器的值右移一位48RRC A 1 1 将累加器含进位C 右移一位49SWAP A 1 1 将累加器的高4 位与低4 位的内容交换。(A)3-0(A)7-4 数据转移指令/内部数据传送指令50MOV A,Rn 11 将寄存器的内容载入累加器51MOV A,direct 2 1 将直接地址的内容载入累加器52MOV A,Ri 1 1 将间接地址的内容载入累加器53MOV A,#data 2 1 将常数载入累加器54MOV Rn,A1 1 将累加器的内容载入寄存器55MOV Rn,direct 2 2 将直接地址的内容载入寄存器56MOV Rn,gdata 2 1 将常数载入寄存器57MOV direct,A2 1 将累加器的内容存入直接地址58MOV direct,Rn2 2 将寄存器的内容存入直接地址59MOV direct1,direct23 2 将直接地址2 的内容存入直接地址1 60MOV direct,Ri 22 将间接地址的内容存入直接地址61MOV direct,#data 32 将常数存入直接地址62MOV Ri,A 1 1 将累加器的内容存入某间接地址63MOV Ri,direct 22 将直接地址的内容存入某间接地址名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 25 页 -64MOV Ri,#data 2 1 将常数存入某间接地址65MOV DPTR,#data16 3 2 将16 位的常数存入数据指针寄存器/查表指令,注意是在程序存储区查表。66MOVC A,A+DPTR1 2(A)(A)+(DPTR)累加器的值再加数据指针寄存器的值为其所指定地址,将该地址的内容读入累加器67MOVC A,A+PC12(PC)(PC)+1;(A)(A)+(PC)累加器的值加程序计数器的值作为其所指定地址,将该地址的内容读入累加器。修正值是从下一条语句开始算起。/CPU 对片外 RAM 访问(既是外部数据传送指令)68MOVX A,Ri 1 2 将间接地址所指定外部存储器的内容读入累加器(8 位地址)69MOVX A,DPTR1 2 将数据指针所指定外部存储器的内容读入累加器(16 位地址)70MOVX Ri,A 1 2将累加器的内容写入间接地址所指定的外部存储器(8 位地址)71MOVX DPTR,A1 2将累加器的内容写入数据指针所指定的外部存储器(16 位地址)名师资料总结-精品资料欢迎下载-名师精心整理-第 10 页,共 25 页 -72PUSH direct 22将直接地址的内容压入堆栈区73POP direct 22从堆栈弹出该直接地址的内容/调用时有自动入栈出栈操作,而且是 PC低位先入栈,高位后入栈。出栈时 PC高位先出栈,低位后出栈。/PC 入栈时,低位先入栈,高位后入栈。74XCH A,Rn 11将累加器的内容与寄存器的内容互换75XCH A,direct 21将累加器的值与直接地址的内容互换76XCH A,Ri 1 1 将累加器的值与间接地址的内容互换77XCHD A,Ri 11 将累加器的低 4 位与间接地址的低4 位互换布尔代数运算78CLR C 11清除进位 C为 0 79CLR bit 2 1清除直接地址的某位为0 80SET B C 11 设定进位 C为 1 81SET B bit 2 1设定直接地址的某位为1 名师资料总结-精品资料欢迎下载-名师精心整理-第 11 页,共 25 页 -82CPL C 11 将进位 C的值反相83CPL bit 21将直接地址的某位值反相/注意:在位与与位或运算中,目标操作数只能是C 84ANL C,bit 2 2将进位 C与直接地址的某位做AND的逻辑判断,结果存回进位 C 85ANL C,/bit 2 2将进位 C与直接地址的某位的反相值做AND 的逻辑判断,结果存回进位C 86ORL C,bit 2 2将进位 C与直接地址的某位做OR的逻辑判断,结果存回进位 C 87ORL C,/bit 22将进位 C与直接地址的某位的反相值做OR的逻辑判断,结果存回进位C 88MOV C,bit 2 1将直接地址的某位值存入进位C 89MOV bit,C2 2 将进位 C的值存入直接地址的某位90JC rel 2 2若进位 C=1则跳至 rel 的相关地址91JNC rel 2 2若进位 C=0则跳至 rel 的相关地址92JB bit,rel 32若直接地址的某位为1,则跳至 rel 的相关地址93JNB bit,rel 32 若直接地址的某位为0,则跳至 rel 的相关地址94 JBC bit,rel3 2 若直接地址的某位为1,则跳至 rel 的相关地址,并将该位值清除为 0 程序跳跃名师资料总结-精品资料欢迎下载-名师精心整理-第 12 页,共 25 页 -95ACALL addr11 2 2 调用 2K程序存储器范围内的子程序(2字节)96LCALL addr16 3 2 调用 64K程序存储器范围内的子程序(3 字节)97RET 1 2 从子程序返回98RETI 1 2 从中断子程序返回99AJMP addr11 22 绝对跳跃(2K 内)100LJMP addr16 3 2 长跳跃(64K 内)101SJMP rel 2 2 短跳跃(2K 内)-128+127字节102JMP A+DPTR 1 2 跳至累加器的内容加数据指针所指的相关地址103JZ rel22 累加器的内容为0,则跳至 rel 所指相关地址104JNZ rel2 2累加器的内容不为0,则跳至 rel 所指相关地址105 CJNE A,direct,rel3 2将累加器的内容与直接地址的内容比较,不相等则跳至 rel 所指的相关地址(此操作影响进位标志为C,A-direct)名师资料总结-精品资料欢迎下载-名师精心整理-第 13 页,共 25 页 -106CJNE A,#data,rel 3 2将累加器的内容与常数比较,若不相等则跳至 rel 所指的相关地址107CJNE Rn,#data,rel 32将寄存器的内容与常数比较,若不相等则跳至rel所指的相关地址108.CJNE Rn,#data,rel 3 2将累加器的内容与常数比较,若不相等则跳至 rel 所指的相关地址109.DJNZ Rn,rel 110.DJNZ direct,rel 取反指令:CPL A ;A=A 非清零指令:CLR A ;A=0 例:把累加器 A中的第四位送入 300H单元MOV DPTR#300H ANL A,#0FH MOVX DPTR,A 例:将累加器 A中的低四位的状态通过P1口的高四位输出ANL A,#0FH 名师资料总结-精品资料欢迎下载-名师精心整理-第 14 页,共 25 页 -SWAP A ANL P1,#0FH ORL P1,A 控制条件转移指令:这类指令的功能主要是控制程序从原顺序执行地址转移到其他指令地址上。计算机在运行过程中,有时因为任务要求,程序不能顺序逐条执行指令,需要改变程序运行的方向,或需要调用子程序,或需要从子程序中返回。此时都需要改变计算器PC中的内容,控制转移类指令可用来实现这一要求。控制条件转移指令多数不影响程序状态寄存器。LJMP addr16 ;addr16-PC AJMP addr11 ;(PC)+2-PC,addr11-PC.10PC0,SJMP rel ;(PC)+2+rel-PC 第一条指令:称“长转转移指令”。指令执行结果是将16 位地址addr16 送程序计数器 PC。第二条指令:称“绝对转移指令”,也称“短转移指令”。它吧PC原来的高 5 位、操作码的第 75 位以及操作数的低8 位合并在一起,构成 16 位转移地址。因为地址的高5 位不变,仅低 11 位发生变化,因此,寻址范围必须在该指令地址加2 后的 2KB区域内。名师资料总结-精品资料欢迎下载-名师精心整理-第 15 页,共 25 页 -第三条指令:称“无条件转移指令”。该指令是双字节,指令的操作数是相对地址,rel 是一个带符号的偏移字节数(2 的补码),其范围是-128+127。负数表示向后转移。正数表示向前转移。该指令执行后的目的地址值的计算公式如下:,如果rel 为大于 7fH 的数,则认为是负数的补码(高位认为是符号位),因为计算机是以补码的形式存储数据的。目的地址值 =本指令地址值+2+rel 例:1000H LJMP 3000H 执行后,PC由 1003 变为 3000H 2030H AJMP 60H 执行后,PC由 2030H变为 2060H 2000H SJMP 7 执行后,PC值有 2002 变为 2009 乘法指令:MUL 除法指令:CLR A CPL A x 的补码,加 y 的补码,等于 x+y 的补码DPTR名师资料总结-精品资料欢迎下载-名师精心整理-第 16 页,共 25 页 -如果是用 c 语言编程,可以不必注意这些问题,因为编程软件会自动帮你分配,也不容易出错!数据指针 DPTR 是 80C51中一个功能比较特殊的寄存器。从结构DPTR是一个 16 位的特殊功能寄存器,其高位字节寄存器用DPH 表示,低位字节寄存器用DPL表示,DPTR 既可以作为一个16 位的寄存器来处理,也可以作为两个独立的8 位寄存器来使用。主要功能是存放16 位地址,作为片外RAM 寻址用的地址寄存器(间接寻址),故称数据指针。访问片外 数据存储 器的指令为:MOVX A,DPTR 读MOVX DPTR,A 写DPTR 的另一个作用是变址寻址,访问程序存储器,做查表指令:如:以 dptr 为基址寄存器,将 dptr 的内容与累加器 a 的内容相加得到变址地址movc a,a+dptr;(a)-(a)+(dptr)DB、DWDB:定义字节变量,其后的每一个表达式占一个字节。DW:定义字变量,其后的每一个表达式的值占二个字节,低字节在低地址,高字节在高地名师资料总结-精品资料欢迎下载-名师精心整理-第 17 页,共 25 页 -址。它们的作用是将所需要的数据放入指定的存储单元中,或者是为程序分配指定数目的存储单元,并根据情况对它们进行初始化一般的格式为【单元名称】:DB 表达式(及存储单元内容);【注释】例如 dui 240128 写入一个中文字,定义中文字变量为HZ2000:DB 000H,000H,000H,001H,003H,006H,00FH,007H,007H,01FH,003H,01FH,037H,00DH,000H,000HDB 000H,000H,0C7H,080H,03FH,0FBH,0BEH,078H,0EFH,0FDH,0FFH,0FBH,0FBH,08EH,00CH,000H;编,0【对$NOMOD51的理解】很多朋友在看 asm代码的时候,对下面的语句不是很了解,下面解说一下。$NOMOD51$INCLUDE(REG932.INC)解释:$NOMOD51,这一指令功能是使A51不识别 8051 的所有预定义符号。$INCLUDE(REG932.INC),这一指令功能使用用户自定义的符号文件。名师资料总结-精品资料欢迎下载-名师精心整理-第 18 页,共 25 页 -这两条语句必须配合使用,使用了$INCLUDE(REG932.INC),就必须使用$NOMOD51,否则回因多重定义而产生错误。/查表指令66MOVC A,A+DPTR1 2(A)(A)+(DPTR)累加器的值再加数据指针寄存器的值为其所指定地址,将该地址的内容读入累加器67MOVC A,A+PC12(PC)(PC)+1;(A)(A)+(PC)累加器的值加程序计数器的值作为其所指定地址,将该地址的内容读入累加器/对于 66,CPU 读取单字节指令后,PC内容自动加 1。其功能能为将新的 PC内容与累加器 A内无符号数据相加形成地址,并取出该地址内容送至累加器 A。这种指令表很方便,但是只能查询指令做子啊地址以后 256 字节范围的代码或者常数。/对于 67,以 DPTR 为基址进行查表,使用前,先给DPTR 赋予某些特定查表地址,其范围可以打整个程序存储器64KB空间。但在此前,如果 DPTR 已经赋值另作它用,则装入新查表之前必须保存原值,可以用堆栈操作指令PUSH 保存。/对于 66,67 指令,不改变 PC或者 DPTR 的内容。例如:1010H;02H 1011H;04H 1012H;06H 1013H;08H执行程序如下:1000H:MOV A,#0DH名师资料总结-精品资料欢迎下载-名师精心整理-第 19 页,共 25 页 -1001H:MOVC A,A+PC1002H:MOV R0,A结果:A=02H,R0=02H,PC=1004H例如:7010H:02H7011H:04H7012H:06H7013H:08H执行如下程序:1004H:MOV A,#10H1006H:MOV DPTR,#7000H1009H:MOVC A,A+DPTR结果:A=02H,PC=100AH 72PUSHdirect 22 将直接地址的内容压入堆栈区73POPdirect 22 从堆栈弹出该直接地址的内容堆栈操作入栈时,先将堆栈指针SP的内容加一,然后将直接寻址单元中的数据送到(也称“压入”)到SP所指向的单元中。如果数据已经推入堆栈,则SP指向最后兑入数据所在的存储单元(既是指向栈顶)。名师资料总结-精品资料欢迎下载-名师精心整理-第 20 页,共 25 页 -出栈时,(也称“弹出”),其功能是先将SP指针所指向单元的内容送到直接寻址单元中,然后将 SP的内容减一,此时 SP指向新的栈顶。由于入栈操作,SP先加一,故实际的栈底为初始SP+1,累加器 A是一个特殊的寄存器,无论 A是作为目的寄存器还是作为源寄存器,CPU 对它有专门的操作指令,如果使用A的地址 E0H直接寻址,虽然也可以完成上述功能,但是机器码要多一个,执行周期要加长。工作寄存器也有类似的特点直接寻址是,direct指出的存储单元为片内RAM 的 00H7FH 单元以及 80HFFH 中的特殊功能寄存器SFR。在间接寻址 Ri中,用当前 R0或者 R1作为地址指针,利用指令MOV 或者 MOVX 可以访问片内 RAM的 007FH(或 00-FFH)和片外 RAM 的 256 个单元。例如把 3040H单元存入 0DH,MOV A,#0DHMOV DPTR,#3040HMOV DPTR,A例如把 52 片内 93H单元的内容送到外部数据存储器3000H单元中:MOV DPTR,#3000H名师资料总结-精品资料欢迎下载-名师精心整理-第 21 页,共 25 页 -MOV R0,#93HMOV A,R0MOV DPTR,A 例如:把陈序存储器ROM 中起始地址为 2000H,长度为 30H的数据块送到以 3A00H为起始地址的外部RAM 中,要求使用两个DPTR 数据指针来简化程序,注意使用辅助寄存器AUXR1,其地址为 A2H程序如下:MOV DPTR,#3A00HORL A2H,#1MOV DPTR,#2000HMOV R0,30HLOOP:MOVC A,A+DPTRINC DPTR ANL A2H,#0 MOVX DPTR,A INC DPTR ORL A2H,#1 DJNZ R0,LOOP 名师资料总结-精品资料欢迎下载-名师精心整理-第 22 页,共 25 页 -压缩 BCD 码就是在一个字节中存放2 位 BCD 码。某子程序 SUB1的入口地址为 340BH,调用指令“LCALL SUB1 地址为2042H,改段程序调用过程中,PC以及 SP的变化如下:2040H MOV SP,#20H ;设置堆栈指针 20H-SP2042H LCALL SUB1 ;调用子程序,2045-PC;(21H)-SP;45H-(21H);(22H)-SP;20H-(22H);340BH-PC,340BH SUB1:MOV A,R0,3412H RET ;(22H)-PCH;(45H)-PCL;此时PC=2045H,SP=20HNOP 产生一个机器周期的延时。位操作指令:在汇编语言中,位地址的表达式有如下几种:1.直接位地址寻址,如D4H,2。点操作符号方式,如PSW.4和(D0H).4;3.位名称方式:如RS1名师资料总结-精品资料欢迎下载-名师精心整理-第 23 页,共 25 页 -4.用户定义方式,如使用伪指令BIT 定义为”SUB.REG bit RE1,经过定义后,允许指令中用SUB.REG 代替“RS1位传送指令:MOV C,bit(2 字节)MOV bit,C(2 字节)位修正指令:CLR,CPL,SETB位逻辑指令:ANL C,bitANL C,/bitORL C,bitORL C,/bit这组指令功能是吧进位标志C的内容以及直接位地址的内容逻辑”与“,”或“后的操作结果返回到C中。/表示对位取反。例题:(60H)43H,(61H)87H,指令如下:CLR C MOV A,9AH SUBB A,60H ADD A,61H DA A 名师资料总结-精品资料欢迎下载-名师精心整理-第 24 页,共 25 页 -MOV 62H,A 执行完本段指令后(62H)=_44H_;该程序可实现压缩 BCD码减法运算运算。2015 12 31 南昌大学 13 级自动化名师资料总结-精品资料欢迎下载-名师精心整理-第 25 页,共 25 页 -