单片机汇编DA指令什么用
单片机汇编言语DA指令,是指十进制加法运算。是结合加法指令一起用的,例如DAA,这条指令是十进制调整指令,用来在进行十进制运算(BCD码)时进行校正的。当两个BCD码加法时,01H+09H应该是等于10H,但由于 单片机的加法指令是二进制的运算,加完之后得到的结果是0AH,这时就需要再加上一个06H。扩展资料:其他常用单片机汇编指令:1、MOV A,Rn 寄存器内容送入累加器2、MOV A,direct 直接地址单元中的数据送入累加器3、MOV A,@Ri (i=0,1)间接RAM 中的数据送入累加器4、MOV A,#data 立即数送入累加器5、MOV Rn,A 累加器内容送入寄存器6、MOV Rn,direct 直接地址单元中的数据送入寄存器7、MOV Rn,#data 立即数送入寄存器8、MOV direct,A 累加器内容送入直接地址单元9、MOV direct,Rn 寄存器内容送入直接地址单元10、MOV direct,direct 直接地址单元中的数据送入另一个直接地址单元参考资料来源:百度百科—单片机汇编指令
单片机的基本指令有哪些?
不知道你是问的哪种单片机下面给你的是MCS-51的,希望对你有帮助,如有,麻烦采纳,谢谢 数据传送指令共有29条,数据传送指令一般的操作是把源操作数传送到目的操作数,指令执行完成后,源操作数不变,目的操作数等于源操作数。如果要求在进行数据传送时,目的操作数不丢失,则不能用直接传送指令,而采用交换型的数据传送指令,数据传送指令不影响标志C,AC和OV,但可能会对奇偶标志P有影响。 \x0d\x0a\x0d\x0a[1]. 以累加器A为目的操作数类指令(4条) \x0d\x0a这4条指令的作用是把源操作数指向的内容送到累加器A。有直接、立即数、寄存器和寄存器间接寻址方式: \x0d\x0a\x0d\x0aMOV A,data ;(data)→(A) 直接单元地址中的内容送到累加器A \x0d\x0aMOV A,#data ;#data→(A) 立即数送到累加器A中 \x0d\x0aMOV A,Rn ;(Rn)→(A) Rn中的内容送到累加器A中 \x0d\x0aMOV A,@Ri ;((Ri))→(A) Ri内容指向的地址单元中的内容送到累加器A \x0d\x0a\x0d\x0a[2]. 以寄存器Rn为目的操作数的指令(3条) \x0d\x0a这3条指令的功能是把源操作数指定的内容送到所选定的工作寄存器Rn中。有直接、立即和寄存器寻址方式: \x0d\x0a\x0d\x0aMOV Rn,data ;(data)→(Rn) 直接寻址单元中的内容送到寄存器Rn中 \x0d\x0aMOV Rn,#data ;#data→(Rn) 立即数直接送到寄存器Rn中 \x0d\x0aMOV Rn,A ;(A)→(Rn) 累加器A中的内容送到寄存器Rn中 \x0d\x0a\x0d\x0a[3]. 以直接地址为目的操作数的指令(5条) \x0d\x0a这组指令的功能是把源操作数指定的内容送到由直接地址data所选定的片内RAM中。有直接、立即、寄存器和寄存器间接4种寻址方式: \x0d\x0a\x0d\x0aMOV data,data ;(data)→(data) 直接地址单元中的内容送到直接地址单元 \x0d\x0aMOV data,#data ;#data→(data) 立即数送到直接地址单元 \x0d\x0aMOV data,A ;(A)→(data) 累加器A中的内容送到直接地址单元 \x0d\x0aMOV data,Rn ;(Rn)→(data) 寄存器Rn中的内容送到直接地址单元 \x0d\x0aMOV data,@Ri ;((Ri))→(data) 寄存器Ri中的内容指定的地址单元中数据送到直接地址单元 \x0d\x0a\x0d\x0a[4]. 以间接地址为目的操作数的指令(3条) \x0d\x0a这组指令的功能是把源操作数指定的内容送到以Ri中的内容为地址的片内RAM中。有直接、立即和寄存器3种寻址方式: \x0d\x0a\x0d\x0aMOV @Ri,data ;(data)→((Ri)) 直接地址单元中的内容送到以Ri中的内容为地址的RAM单元 \x0d\x0aMOV @Ri,#data ;#data→((Ri)) 立即数送到以Ri中的内容为地址的RAM单元 \x0d\x0aMOV @Ri,A ;(A)→((Ri)) 累加器A中的内容送到以Ri中的内容为地址的RAM单元 \x0d\x0a\x0d\x0a[5]. 查表指令(2条) \x0d\x0a这组指令的功能是对存放于程序存储器中的数据表格进行查找传送,使用变址寻址方式: \x0d\x0a\x0d\x0aMOVC A,@A+DPTR ;((A))+(DPTR)→(A) 表格地址单元中的内容送到累加器A中 \x0d\x0aMOVC A,@A+PC ;((PC))+1→(A),((A))+(PC)→(A) 表格地址单元中的内容送到累加器A中 \x0d\x0a\x0d\x0a[6]. 累加器A与片外数据存储器RAM传送指令(4条) \x0d\x0a这4条指令的作用是累加器A与片外RAM间的数据传送。使用寄存器寻址方式: \x0d\x0a\x0d\x0aMOVX @DPTR,A ;(A)→((DPTR)) 累加器中的内容送到数据指针指向片外RAM地址中 \x0d\x0aMOVX A, @DPTR ;((DPTR))→(A) 数据指针指向片外RAM地址中的内容送到累加器A中 \x0d\x0aMOVX A, @Ri ;((Ri))→(A) 寄存器Ri指向片外RAM地址中的内容送到累加器A中 \x0d\x0aMOVX @Ri,A ;(A)→((Ri)) 累加器中的内容送到寄存器Ri指向片外RAM地址中 \x0d\x0a\x0d\x0a[7]. 堆栈操作类指令(2条) \x0d\x0a这4类指令的作用是把直接寻址单元的内容传送到堆栈指针SP所指的单元中,以及把SP所指单元的内容送到直接寻址单元中。这类指令只有两条,下述的第一条常称为入栈操作指令,第二条称为出栈操作指令。需要指出的是,单片机开机复位后,(SP)默认为07H,但一般都需要重新赋值,设置新的SP首址。入栈的第一个数据必须存放于SP+1所指存储单元,故实际的堆栈底为SP+1所指的存储单元。 \x0d\x0a\x0d\x0aPUSH data ;(SP)+1→(SP),(data)→(SP) 堆栈指针首先加1,直接寻址单元中的数据送到堆栈指针SP所指的单元中 \x0d\x0aPOP data ;(SP)→(data)(SP)-1→(SP), 堆栈指针SP所指的单元数据送到直接寻址单元中,堆栈指针SP再进行减1操作 \x0d\x0a\x0d\x0a[8]. 交换指令(5条) \x0d\x0a这5条指令的功能是把累加器A中的内容与源操作数所指的数据相互交换。 \x0d\x0a\x0d\x0aXCH A,Rn ;(A)←→(Rn)累加器与工作寄存器Rn中的内容互换 \x0d\x0aXCH A,@Ri ;(A)←→((Ri))累加器与工作寄存器Ri所指的存储单元中的内容互换 \x0d\x0aXCH A,data ;(A)←→(data)累加器与直接地址单元中的内容互换 \x0d\x0aXCHD A,@Ri ;(A 3-0 )←→((Ri) 3-0 )累加器与工作寄存器Ri所指的存储单元中的内容低半字节互换 \x0d\x0aSWAP A ;(A 3-0 )←→(A 7-4 )累加器中的内容高低半字节互换 \x0d\x0a\x0d\x0a[9]. 16位数据传送指令(1条) \x0d\x0a这条指令的功能是把16位常数送入数据指针寄存器。 \x0d\x0a\x0d\x0aMOV DPTR,#data16 ;#dataH→(DPH),#dataL→(DPL)16位常数的高8位送到DPH,低8位送到DPL \x0d\x0a\x0d\x0aMCS-51算术运算指令 \x0d\x0a\x0d\x0a算术运算指令共有24条,算术运算主要是执行加、减、乘、除法四则运算。另外MCS-51指令系统中有相当一部分是进行加、减1操作,BCD码的运算和调整,我们都归类为运算指令。虽然MCS-51单片机的算术逻辑单元ALU仅能对8位无符号整数进行运算,但利用进位标志C,则可进行多字节无符号整数的运算。同时利用溢出标志,还可以对带符号数进行补码运算。需要指出的是,除加、减1指令外,这类指令大多数都会对PSW(程序状态字)有影响。这在使用中应特别注意。 \x0d\x0a\x0d\x0a[1]. 加法指令(4条) \x0d\x0a这4条指令的作用是把立即数,直接地址、工作寄存器及间接地址内容与累加器A的内容相加,运算结果存在A中。 \x0d\x0a\x0d\x0aADD A,#data ;(A)+#data→(A) 累加器A中的内容与立即数#data相加,结果存在A中 \x0d\x0aADD A,data ;(A)+(data)→(A) 累加器A中的内容与直接地址单元中的内容相加,结果存在A中 \x0d\x0aADD A,Rn ;(A)+(Rn)→(A) 累加器A中的内容与工作寄存器Rn中的内容相加,结果存在A中 \x0d\x0aADD A,@Ri ;(A)+((Ri))→(A) 累加器A中的内容与工作寄存器Ri所指向地址单元中的内容相加,结果存在A中 \x0d\x0a\x0d\x0a[2]. 带进位加法指令(4条) \x0d\x0a这4条指令除与[1]功能相同外,在进行加法运算时还需考虑进位问题。 \x0d\x0a\x0d\x0aADDC A,data ;(A)+(data)+(C)→(A) 累加器A中的内容与直接地址单元的内容连同进位位相加,结果存在A中 \x0d\x0aADDC A,#data ;(A)+#data +(C)→(A) 累加器A中的内容与立即数连同进位位相加,结果存在A中 \x0d\x0aADDC A,Rn ;(A)+Rn+(C)→(A) 累加器A中的内容与工作寄存器Rn中的内容、连同进位位相加,结果存在A中 \x0d\x0aADDC A,@Ri ;(A)+((Ri))+(C)→(A) 累加器A中的内容与工作寄存器Ri指向地址单元中的内容、连同进位位相加,结果存在A中 \x0d\x0a\x0d\x0a[3]. 带借位减法指令(4条) \x0d\x0a这组指令包含立即数、直接地址、间接地址及工作寄存器与累加器A连同借位位C内容相减,结果送回累加器A中。 \x0d\x0a这里我们对借位位C的状态作出说明,在进行减法运算中,CY=1表示有借位,CY=0则无借位。OV=1声明带符号数相减时,从一个正数减去一个负数结果为负数,或者从一个负数中减去一个正数结果为正数的错误情况。在进行减法运算前,如果不知道借位标志位C的状态,则应先对CY进行清零操作。 \x0d\x0a\x0d\x0aSUBB A,data ;(A)-(data) - (C)→(A) 累加器A中的内容与直接地址单元中的内容、连同借位位相减,结果存在A中 \x0d\x0aSUBB A,#data ;(A)-#data -(C)→(A) 累加器A中的内容与立即数、连同借位位相减,结果存在A中 \x0d\x0aSUBB A,Rn ;(A)-(Rn) -(C)→(A) 累加器A中的内容与工作寄存器中的内容、连同借位位相减,结果存在A中 \x0d\x0aSUBB A,@Ri ;(A)-((Ri)) -(C)→(A) 累加器A中的内容与工作寄存器Ri指向的地址单元中的内容、连同借位位相减,结果存在A中 \x0d\x0a\x0d\x0a[4]. 乘法指令(1条) \x0d\x0a这个指令的作用是把累加器A和寄存器B中的8位无符号数相乘,所得到的是16位乘积,这个结果低8位存在累加器A,而高8位存在寄存器B中。如果OV=1,说明乘积大于FFH,否则OV=0,但进位标志位CY总是等于0。 \x0d\x0a\x0d\x0aMUL AB ;(A)×(B)→(A)和(B) 累加器A中的内容与寄存器B中的内容相乘,结果存在A、B中 \x0d\x0a\x0d\x0a[5]. 除法指令(1条) \x0d\x0a这个指令的作用是把累加器A的8位无符号整数除以寄存器B中的8位无符号整数,所得到的商存在累加器A,而余数存在寄存器B中。除法运算总是使OV和进位标志位CY等于0。如果OV=1,表明寄存器B中的内容为00H,那么执行结果为不确定值,表示除法有溢出。 \x0d\x0a\x0d\x0aDIV AB ;(A)÷(B)→(A)和(B) 累加器A中的内容除以寄存器B中的内容,所得到的商存在累加器A,而余数存在寄存器B中。 \x0d\x0a\x0d\x0a[6]. 加1指令(5条) \x0d\x0a这5条指令的的功能均为原寄存器的内容加1,结果送回原寄存器。上述提到,加1指令不会对任何标志有影响,如果原寄存器的内容为FFH,执行加1后,结果就会是00H。这组指令共有直接、寄存器、寄存器减间址等寻址方式: \x0d\x0a\x0d\x0aINC A ;(A)+1→(A) 累加器A中的内容加1,结果存在A中 \x0d\x0aINC data ;(data)+1→(data) 直接地址单元中的内容加1,结果送回原地址单元中 \x0d\x0aINC @Ri ;((Ri))+1→((Ri)) 寄存器的内容指向的地址单元中的内容加1,结果送回原地址单元中 \x0d\x0aINC Rn ;(Rn)+1→(Rn)寄存器Rn的内容加1,结果送回原地址单元中 \x0d\x0aINC DPTR ;(DPTR)+1→(DPTR)数据指针的内容加1,结果送回数据指针中 \x0d\x0a\x0d\x0a在INC data这条指令中,如果直接地址是I/O,其功能是先读入I/O锁存器的内容,然后在CPU进行加1操作,再输出到I/O上,这就是“读—修改—写”操作。 \x0d\x0a\x0d\x0a[7]. 减1指令(4条) \x0d\x0a这组指令的作用是把所指的寄存器内容减1,结果送回原寄存器,若原寄存器的内容为00H,减1后即为FFH,运算结果不影响任何标志位,这组指令共有直接、寄存器、寄存器间址等寻址方式,当直接地址是I/O口锁存器时,“读—修改—写”操作与加1指令类似。 \x0d\x0a\x0d\x0aDEC A ;(A)-1→(A)累加器A中的内容减1,结果送回累加器A中 \x0d\x0aDEC data ;(data)-1→(data)直接地址单元中的内容减1,结果送回直接地址单元中 \x0d\x0aDEC @Ri ;((Ri))-1→((Ri))寄存器Ri指向的地址单元中的内容减1,结果送回原地址单元中 \x0d\x0a\x0d\x0aDEC Rn ;(Rn)-1→(Rn)寄存器Rn中的内容减1,结果送回寄存器Rn中 \x0d\x0a\x0d\x0a[8]. 十进制调整指令(1条) \x0d\x0a在进行BCD码运算时,这条指令总是跟在ADD或ADDC指令之后,其功能是将执行加法运算后存于累加器A中的结果进行调整和修正。 \x0d\x0a\x0d\x0aDA A \x0d\x0a\x0d\x0aMCS-51逻辑运算及移位指令 \x0d\x0a\x0d\x0a逻辑运算和移位指令共有25条,有与、或、异或、求反、左右移位、清0等逻辑操作,有直接、寄存器和寄存器间址等寻址方式。这类指令一般不影响程序状态字(PSW)标志。 \x0d\x0a\x0d\x0a[1]. 循环移位指令(4条) \x0d\x0a这4条指令的作用是将累加器中的内容循环左或右移一位,后两条指令是连同进位位CY一起移位。 \x0d\x0a\x0d\x0aRL A ;累加器A中的内容左移一位 \x0d\x0aRR A ;累加器A中的内容右移一位 \x0d\x0aRLC A ;累加器A中的内容连同进位位CY左移一位 \x0d\x0aRRC A ;累加器A中的内容连同进位位CY右移一位 \x0d\x0a\x0d\x0a[2]. 累加器半字节交换指令(1条) \x0d\x0a这条指令是将累加器中的内容高低半字节互换,这在上一节中内容已有介绍。 \x0d\x0a\x0d\x0aSWAP A ; 累加器中的内容高低半字节互换 \x0d\x0a\x0d\x0a[3]. 求反指令(1条) \x0d\x0a这条指令将累加器中的内容按位取反。 \x0d\x0a\x0d\x0aCPL A ; 累加器中的内容按位取反 \x0d\x0a\x0d\x0a[4]. 清零指令(1条) \x0d\x0a这条指令将累加器中的内容清0。 \x0d\x0a\x0d\x0aCLR A ; 0→(A),累加器中的内容清0 \x0d\x0a\x0d\x0a[5]. 逻辑与操作指令(6条) \x0d\x0a这组指令的作用是将两个单元中的内容执行逻辑与操作。如果直接地址是I/O地址,则为“读—修改—写”操作。 \x0d\x0a\x0d\x0aANL A,data ;累加器A中的内容和直接地址单元中的内容执行与逻辑操作。结果存在寄存器A中。 \x0d\x0aANL data,#data ;直接地址单元中的内容和立即数执行与逻辑操作。结果存在直接地址单元中。 \x0d\x0aANL A,#data ;累加器A的内容和立即数执行与逻辑操作。结果存在累加器A中。 \x0d\x0aANL A,Rn ;累加器A的内容和寄存器Rn中的内容执行与逻辑操作。结果存在累加器A中。 \x0d\x0aANL data,A ;直接地址单元中的内容和累加器A的内容执行与逻辑操作。结果存在直接地址单元中。 \x0d\x0aANL A,@Ri ;累加器A的内容和工作寄存器Ri指向的地址单元中的内容执行与逻辑操作。结果存在累加器A中。 \x0d\x0a\x0d\x0a[6]. 逻辑或操作指令(6条) \x0d\x0a这组指令的作用是将两个单元中的内容执行逻辑或操作。如果直接地址是I/O地址,则为“读—修改—写”操作。 \x0d\x0a\x0d\x0aORL A,data ;累加器A中的内容和直接地址单元中的内容执行逻辑或操作。结果存在寄存器A中。 \x0d\x0aORL data,#data ;直接地址单元中的内容和立即数执行逻辑或操作。结果存在直接地址单元中。 \x0d\x0aORL A,#data ;累加器A的内容和立即数执行逻辑或操作。结果存在累加器A中。 \x0d\x0aORL A,Rn ;累加器A的内容和寄存器Rn中的内容执行逻辑或操作。结果存在累加器A中。 \x0d\x0aORL data,A ;直接地址单元中的内容和累加器A的内容执行逻辑或操作。结果存在直接地址单元中。 \x0d\x0aORL A,@Ri ;累加器A的内容和工作寄存器Ri指向的地址单元中的内容执行逻辑或操作。结果存在累加器A中。 \x0d\x0a\x0d\x0a[7]. 逻辑异或操作指令(6条) \x0d\x0a这组指令的作用是将两个单元中的内容执行逻辑异或操作。如果直接地址是I/O地址,则为“读—修改—写”操作。 \x0d\x0a\x0d\x0aXRL A,data ;累加器A中的内容和直接地址单元中的内容执行逻辑异或操作。结果存在寄存器A中。 \x0d\x0aXRL data,#data ;直接地址单元中的内容和立即数执行逻辑异或操作。结果存在直接地址单元中。 \x0d\x0aXRL A,#data ;累加器A的内容和立即数执行逻辑异或操作。结果存在累加器A中。 \x0d\x0aXRL A,Rn ;累加器A的内容和寄存器Rn中的内容执行逻辑异或操作。结果存在累加器A中。 \x0d\x0aXRL data,A ;直接地址单元中的内容和累加器A的内容执行逻辑异或操作。结果存在直接地址单元中。 \x0d\x0aXRL A,@Ri ;累加器A的内容和工作寄存器Ri指向的地址单元中的内容执行逻辑异或操作。结果存在累加器A中。 \x0d\x0a\x0d\x0aMCS-51控制转移指令 \x0d\x0a\x0d\x0a控制转移指令用于控制程序的流向,所控制的范围即为程序存储器区间,MCS-51系列单片机的控制转移指令相对丰富,有可对64kB程序空间地址单元进行访问的长调用、长转移指令,也有可对2kB字节进行访问的绝对调用和绝对转移指令,还有在一页范围内短相对转移及其它无条件转移指令,这些指令的执行一般都不会对标志位有影响。 \x0d\x0a\x0d\x0a[1]. 无条件转移指令(4条) \x0d\x0a这组指令执行完后,程序就会无条件转移到指令所指向的地址上去。长转移指令访问的程序存储器空间为16地址64kB,绝对转移指令访问的程序存储器空间为11位地址2kB空间。 \x0d\x0a\x0d\x0aLJMP addr16 ;addr16→(PC),给程序计数器赋予新值(16位地址) \x0d\x0a\x0d\x0aAJMP addr11 ;(PC)+2→(PC),addr11→(PC 10-0 )程序计数器赋予新值(11位地址),(PC 15-11 )不改变 \x0d\x0a\x0d\x0aSJMP rel ;(PC)+ 2 + rel→(PC)当前程序计数器先加上2再加上偏移量给程序计数器赋予新值 \x0d\x0a\x0d\x0aJMP @A+DPTR ;(A)+ (DPTR)→(PC),累加器所指向地址单元的值加上数据指针的值给程序计数器赋予新值 \x0d\x0a\x0d\x0a[2]. 条件转移指令(8条) \x0d\x0a程序可利用这组丰富的指令根据当前的条件进行判断,看是否满足某种特定的条件,从而控制程序的转向。 \x0d\x0a\x0d\x0aJZ rel ; A=0,(PC)+ 2 + rel→(PC),累加器中的内容为0,则转移到偏移量所指向的地址,否则程序往下执行 \x0d\x0a\x0d\x0aJNZ rel ; A≠0,(PC)+ 2 + rel→(PC),累加器中的内容不为0,则转移到偏移量所指向的地址,否则程序往下执行 \x0d\x0a\x0d\x0aCJNE A, data, rel ; A≠(data),(PC)+ 3 + rel→(PC),累加器中的内容不等于直接地址单元的内容,则转移到偏移量所指向的地址,否则程序往下执行 \x0d\x0a\x0d\x0aCJNE A, #data, rel ; A≠#data,(PC)+ 3 + rel→(PC),累加器中的内容不等于立即数,则转移到偏移量所指向的地址,否则程序往下执行 \x0d\x0a\x0d\x0aCJNE Rn, #data, rel ; A≠#data,(PC)+ 3 + rel→(PC),工作寄存器Rn中的内容不等于立即数,则转移到偏移量所指向的地址,否则程序往下执行 \x0d\x0a\x0d\x0aCJNE @Ri, #data, rel ; A≠#data,(PC)+ 3 + rel→(PC),工作寄存器Ri指向地址单元中的内容不等于立即数,则转移到偏移量所指向的地址,否则程序往下执行 \x0d\x0a\x0d\x0aDJNZ Rn, rel ; (Rn)-1→(Rn),(Rn)≠0,(PC)+ 2 + rel→(PC)工作寄存器Rn减1不等于0,则转移到偏移量所指向的地址,否则程序往下执行 \x0d\x0a\x0d\x0aDJNZ data, rel ; (Rn)-1→(Rn),(Rn)≠0,(PC)+ 2 + rel→(PC)直接地址单元中的内容减1不等于0,则转移到偏移量所指向的地址,否则程序往下执行 \x0d\x0a\x0d\x0a[3]. 子程序调用指令(1条) \x0d\x0a子程序是为了便于程序编写,减少那些需反复执行的程序占用多余的地址空间而引入的程序分支,从而有了主程序和子程序的概念,需要反复执行的一些程序,我们在编程时一般都把它们编写成子程序,当需要用它们时,就用一个调用命令使程序按调用的地址去执行,这就需要子程序的调用指令和返回指令。 \x0d\x0a\x0d\x0aLCALL addr16 ; 长调用指令,可在64kB空间调用子程序。此时(PC)+ 3→(PC),(SP)+ 1→(SP),(PC 7-0 )→(SP),(SP)+ 1→(SP),(PC 15-8 )→(SP),addr16→(PC),即分别从堆栈中弹出调用子程序时压入的返回地址 \x0d\x0a\x0d\x0aACALL addr11 ; 绝对调用指令,可在2kB空间调用子程序,此时(PC)+ 2→(PC),(SP)+ 1→(SP),(PC 7-0 )→(SP),(SP)+ 1→(SP),(PC 15-8 )→(SP),addr11→(PC 10-0 ) \x0d\x0a\x0d\x0aRET ; 子程序返回指令。此时(SP)→(PC 15-8 ),(SP)- 1→(SP),(SP)→(PC 7-0 ),(SP)- 1→(SP) \x0d\x0a\x0d\x
汇编语言指令的基本格式是什么
汇编语言的指令格式,目前有两种不同的标准:Windows下的汇编语言基本上都遵循Intel风格的语法,比如:MASM、NASM;而Unix/Linux下的汇编语言基本上都遵循AT&T风格的语法;
一、汇编语言语句的通用格式
[名称[:]] 指令码 [第一操作数][,第二操作数] ;注释
汇编语言的指令码的操作数的个数可以是0、1、2个;当操作数的个数为2的时候,语句还有两种不同的格式:
Windows下Intel风格的汇编语言语句格式为:
[名称[:]] 指令码 目的操作数DST,源操作数SRC ;注释
Unix/Linux下AT&T风格的汇编语言语句格式为:
[名称[:]] 指令码 源操作数SRC,目的操作数DST ;注释
例如: CYCLE: ADD AX,02H ;(AX)<-(AX)+02H
解释:
汇编语言语句格式中的"名称"并不是所有语句都必需的,但是,如果语句中带有"名称",那么,大多数情况下,"名称"都表示的是内存中某一存储单元的地址,也就是"名称"后面各项在内存中存放的第一个存储单元的地址(包括该"名称"所在段的段地址和段内偏移地址);比如上面的指令中,CYCLE就是该语句的名称,CYCLE表示的就是其后面的机器指令码在内存中存放的第一个地址;"名称"与指令码之间的分隔符可以是冒号":",也可以是空格字符" ";当以冒号分割时,该名称代表的是一个标号;当以空格分割时,该名称代表的可能是标号,也可能是变量;当指令码有多个操作数的时候,相邻两个操作数之间要用逗号","分割;指令码与操作数之间必须以空格分割;汇编语言语句的注释必须以分号";"开头;
主要的汇编指令有哪些啊
LDR 和STR——用于字和无符号字节
指令格式:
LDR/STR{cond}{T} Rd,
LDR/STR{cond}B{T} Rd,
LDR{cond}{T} Rd, 加载指定地址的字数据到Rd中;
STR{cond}{T} Rd, 存储Rd中的字数据到指定的地址单元中;
LDR{cond}B{T} Rd, 指令加载指定地址的字节数据到Rd的的最低字节中(Rd的高24位清零);
STR{cond}B{T} Rd, 指令存储Rd中的最低字节数据到指定的地址单元中。
T为可选后缀,若有T,那么即使处理器是在特权模式下,存储系统也将访问看成处理器是在用户模式下,T 在用户模式下无效,不能与前索引偏移一起使用T。
地址部分可用的形式有4种:
零偏移(zero offset) [Rn] ,Rn的值作为传送数据的地址。如:
LDR R0,[R1];
前索引偏移(pre-indexed offset) [Rn,Flexoffset]{!} 在数据传送之前,将偏移量Flexoffset加到Rn 中。其结果作为传送数据的存储器地址。若使用后缀“!”,则结果写回到Rn 中,且Rn 不允许是R15,如:
LDRB R0,[R1,#8]
LDR R0,[R1,#8]!
程序相对偏移(program relative) label(label 必须是在当前指令的土4KB 范围内) 。
程序相对偏移是前索引形式的另一种版本。从PC 计算偏移量,并将PC 作为Rn 生成前索引指令,不能使用后缀“!”,如:
LDR R0,place ;
place地址装入R0
后索引偏移(post-indexed offset) [Rn],Flexoffset。在数据传送后,将偏移量Flexoffset 加到Rn 中,结果写回到Rn,Rn 不允许是R15,如:
LDR R0,[R1],R2,LSL#2 ;
将存储器地址为R1 的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。
偏移量Flexoffset可以是下两种形式之:
1) 取值范围是-4095 到+4095 的整数的表达式,经常是数字常量,如:
STR R5,[R7],#--8
2) 一个寄存器再加上移位(移位由立即数指定),如:
{-}Rm{,shift}
其中:
- :可选负号。若带符号“一”,则从Rn 中减去偏移量。否则,将偏移量加到Rn 中。
Rm :内含偏移量的寄存器。Rm 不允许是R15。
Shift:Rm 的可选移位方法。可以是下列形式的任何一种:
ASR n :算术右移n 位(1<=n<=32)
LSL n :逻辑左移n 位(1<=n<=31)
LSR n :逻辑右移n 位(1<=n<=32)
ROR n :循环右移n 位(1<=n<=31)
RRX :循环右移1 位,带扩展。
AND―――――逻辑”与”操作指令
指令格式:
AND{cond}{S} Rd,Rn,operand2
AND指令将操作数operand2 与Rn 的值按位逻辑”与”,结果存放到目的寄存器Rd 中。若设置S,则根据运算结果影响N、Z位,在计算第二操作数时,更新C位,不影响V位(指令ORR、EOR、BIC 对标志位的影响同AND 指令)。
指令示例:
ANDS R1,R1,R2 ;R1=R1&R2,并根据运算的结果更新标志位
AND R0,R0,#0x0F ;R0=R0&0x0F,取出R0最低4位数据。
ORR―――――逻辑”或”操作指令
指令格式:ORR{cond}{S} Rd,Rn,operand2 ORR指令将操作数operand2 与Rn 的值按位逻辑”或”,结果存放到目的寄存器Rd 中。指令示例:
ORRS R1,R1,R2 ;R1=R1|R2,并根据运算的结果更新标志位
ORR R0,R0,#0x0F ;R0=R0|0x0F,将R0最低4位置1,其余位不变。
BIC―――――位清除指令
指令格式:
BIC{cond}{S} Rd,Rn,operand2
BIC指令将Rn 的值与操作数operand2 的反码按位逻辑”与”,结果存放到目的寄存器Rd 中。指令示例:BIC R0,R0,#0x0F ;将R0最低4位清零,其余位不变。
CMP―――――比较指令
指令格式:
CMP{cond} Rn,operand2
CMP指令用Rn的值减去操作数operand2 ,并将结果的状态(Rn 与operand2比较是大、小、相等)反映在CPSR中,以便后面的指令根据条件标志决定程序的走向。CMP指令与SUBS指令完成的操作一样,只是CMP指令只减,不存结果。
指令示例:
cmp R0,R1 ;比较R0,R1
beq stop ;R0=R1跳到stop
blt less ;R0<R1跳到Less
.
.
.
Less:
.
.
.
Stop:
.
.
.
SUB―――――减法运算指令
指令格式:
SUB{cond}{S} Rd,Rn,operand2 SUB指令用Rn 的值减去操作数operand2 ,并将结果存放到目的寄存器Rd 中。 指令示例:
SUBS R1,R1,R2 ;R1=R1-R2,并并根据运算的结果更新标志位
SUBGT R3,3,#1 ;大于则 R3=R3-1
SUB R0,R2,R3,LSL#2; R0=R2-(R3<<2)
ARM分支指令
助记符
说明
操作
B{cond} lable
分支指令
PC← lable
BL{cond} lable
带链接的分支指令
LR← PC-4 ,PC←lable
BX{cond} Rm
带状态切换的分支指令
PC← Rm,切换处理器状态
指令的条件码
条件码 助记符后缀 标志 含义
0000 EQ Z置位(Z=1) 相等
0001 NE Z清零(Z=0) 不相等
0010 CS C置位 无符号数大于等于
0011 CC C清零 无符号数小于
0100 MI N置位 负数
0101 PL N清零 整数或0
0110 VS V置位 溢出
0111 VC V清零 未溢出
1000 HI C置位且Z清零 无符号数大于
1001 LS Z置位且C清零 无符号数小于等于
1010 GE N等于V(N=V=1或N=V=0) 带符号数大于或等于
1011 LT N不等于V 带符号数小于
1100 GT Z清零且N等于V 带符号数大于
1101 LE Z置位或N不等于V 带符号数小于或等于
1110 AL 忽略 无条件执行
;GPIO寄存器宏定义
GPFCON EQU 0x56000050
GPFDAT EQU 0x56000054
GPFUP EQU 0x56000058
EXPORT LEDTEST
AREA LEDTESTASM,CODE,READONLY ;该伪指令定义了一个代码段,段名为LEDTESTASM,属性只读
LEDTEST
;设置GPF4-GPF7为output
ldr r0,=GPFCON
ldr r1,[r0]
bic r1,r1,#0xff00
orr r1,r1,#0x5500
str r1,[r0]
;禁止GPF4-GPF7端口的上拉电阻
ldr r0,=GPFUP
ldr r1,[r0]
orr r1,r1,#0xf0
str r1,[r0]
looptest
;将数据端口F的数据寄存器的地址附给寄存器r2
ldr r2,=GPFDAT
ldr r3,[r2]
bic r3,r3,#0xf0
orr r3,r3,#0xb0
str r3,[r2] ;GPF6 output 0
ldr r0,=0x2fffff
bl delay ;调用延迟子程序
ldr r3,[r2]
bic r3,r3,#0xf0
orr r3,r3,#0x70
str r3,[r2] ;GPF7 output 0
ldr r0,=0x2fffff ;初始计数值
bl delay ;调用延迟子程序
ldr r3,[r2]
bic r3,r3,#0xf0
orr r3,r3,#0xd0
str r3,[r2] ;GPF5 output 0
ldr r0,=0x2fffff
bl delay ;调用延迟子程序
ldr r3,[r2]
bic r3,r3,#0xf0
orr r3,r3,#0xe0
str r3,[r2] ;GPF4 output 0
ldr r0,=0x2fffff
bl delay ;调用延迟子程序
b looptest
delay
sub r0,r0,#1 ;r0=r0-1
cmp r0,#0x0 ;将r0的值与0相比较
bne delay ;比较的结果不为0(r0不为0),继续调用delay,否则执行下一条语句
mov pc,lr ;返回
END ;程序结束符
汇编指令EQU的作用?
EQU是等值命令。汇编指令EQU的作用如下。1、用符号名代表字符串 。用一个具有一定含义的符号名定义某一个较长的字符串,在随后的程序中就用该符号名。2、用符号名关键字或指令助忆符 。用一个(组)程序员自己习惯的符号名来代替汇编语言中的关键字或指令助忆符。扩展资料:汇编其他指令SHL逻辑左移SAL算术左移(=SHL)SHR逻辑右移( 每位右移, 低位进 CF, 高位补 0)SAR算术右移(每位右移, 低位进 CF, 高位不变)ROL循环左移ROR循环右移CBW字节转换为字(把AL中字节的符号扩展到AH中去)CWD字转换为双字(把AX中的字的符号扩展到DX中去)CWDE字转换为双字(把AX中的字符号扩展到EAX中去)CDQ双字扩展(把EAX中的字的符号扩展到EDX中去)参考资料来源:百度百科-汇编指令

