51单片机汇编指令
注: Rn與Ri中n=0 ~ 7,i=0 ~ 1,另外Cy是進位位,同時也是狀態(tài)位,標志位
數(shù)據(jù)傳送類指令
內(nèi)部數(shù)據(jù)傳送指令
| MOV A,Rn | 將Rn的內(nèi)容傳送給A | 寄存器 | 1 | 1 |
| MOV A,direct | direct是一個地址單元,將該地址的內(nèi)容傳送給A,例如:MOV A,50H | 直接 | 1 | 2 |
| MOV A @Ri | Ri中存儲了一個地址,將該地址的內(nèi)容傳送給A,例如:MOV A ,@R0 | 寄存器間接 | 1 | 1 |
| MOV A #data | 將data傳送到A,例如:MOV A,#00H | 立即數(shù) | 1 | 2 |
| MOV Rn,A | 將A的內(nèi)容傳送到Rn中 | 寄存器 | 1 | 1 |
| MOV Rn,direct | direct是一個地址單元,將該地址的內(nèi)容傳送給Rn,例如:MOV R3,50H | 直接 | 1 | 2 |
| MOV Rn,#data | 將data傳送到Rn,例如:MOV R3,#00H | 立即數(shù) | 1 | 2 |
| MOV direct,A | 將A的內(nèi)容傳送到direct這個地址中,例如:MOV 50H,A | 寄存器 | 1 | 2 |
| MOV direct,Rn | 將Rn中的內(nèi)容傳送到direct這個地址中 | 寄存器 | 1 | 2 |
| MOV direct2,direct1 | 將diret1這個地址中的內(nèi)容傳送到direct2這個地址中 | 直接 | 2 | 3 |
| MOV direct,@Ri | Ri中存儲的是一個地址,將這個地址的內(nèi)容傳送給direct這個地址中 | 寄存器間接 | 2 | 2 |
| MOV direct,#data | 將data這個數(shù)據(jù)傳送到direct這個地址中 | 立即數(shù) | 2 | 3 |
| MOV @Ri,A | Ri中存儲的是一個地址,將A中的內(nèi)容傳送到這個地址中 | 寄存器 | 1 | 1 |
| MOV @Ri,direct | Ri存儲的是一個地址,將direct這個地址中的數(shù)據(jù)傳送到Ri存儲的地址中 | 直接 | 2 | 2 |
| MOV @Ri,#data | Ri存儲的是一個地址,將data傳送到這個地址中,例如:MOV @R0,#00H | 立即數(shù) | 1 | 2 |
| MOV DPTR,#data16 | 將一個16位data16數(shù)據(jù)傳送到DPTR數(shù)據(jù)指針中,高8位送入DPH,低8位送入DPL | 立即數(shù) | 2 | 3 |
外部數(shù)據(jù)傳送指令
| MOVX A,@DPTR | DPTR中存放了一個地址,將該地址的數(shù)據(jù)傳送到A | 寄存器間接 | 2 | 1 |
| MOVX A,@Ri | Ri中存放了一個地址,將該地址的數(shù)據(jù)傳送到A | 寄存器間接 | 2 | 1 |
| MOVX @DPTR,A | DPTR中存放了一個地址,將A中的內(nèi)容傳送到該地址中 | 寄存器 | 2 | 1 |
| MOVX @Ri,A | Ri中存放了一個地址,將A中的內(nèi)容傳送到這個地址中 | 寄存器 | 2 | 1 |
交換類指令
| XCH A,Rn | 將Rn中的內(nèi)容與A中的內(nèi)容互換 | 寄存器 | 1 | 1 |
| XCH A,direct | 將direct這個地址中的內(nèi)容與A中的內(nèi)容互換 | 直接 | 1 | 2 |
| XCH A,@Ri | Ri中存放的是一個地址,將該地址中的內(nèi)容與A中的內(nèi)容互換 | 寄存器間接 | 1 | 1 |
| XCHD A,@Ri | Ri中存放了一個地址,將該地址中的數(shù)據(jù)的低4位與A中數(shù)據(jù)的低4位相交換,高4位不變 | 寄存器間接 | 1 | 1 |
| SWAP A | 將A中的數(shù)據(jù)的高4位與低4位相交換 | 寄存器 | 1 | 1 |
查表指令
| MOVC A,@A+PC | 從PC指令地址開始偏移A個地址后,將該地址中的數(shù)據(jù)再傳送給A | 變址尋址 | 2 | 1 |
| MOVC A,@A+DPTR | 從DPTR地址中偏移A個地址后再將該地址中的內(nèi)容傳送給A | 變址尋址 | 2 | 1 |
堆棧操作指令
| PUSH direct | 將direct 這個地址存放的數(shù)據(jù)入棧 | 直接 | 2 | 2 |
| POP diret | 將棧頂數(shù)據(jù)存放在direct這個地址中 | 直接 | 2 | 2 |
注:在使用堆棧時,先要給SP賦初始值,該值是棧底地址,堆棧遵循先進后出的原則,每入棧一個數(shù)據(jù)后,SP會自加1,出棧時SP會自減1,另外也可對A,B寄存器進行入棧出棧操作,但是對于A寄存器,在賦值時可寫A,但在出棧入棧時要寫成ACC
算術(shù)運算類指令
普通加法指令
| ADD A,Rn | 將A中的數(shù)據(jù)與Rn中的數(shù)據(jù)相加并將結(jié)果存放在A中 |
| ADD A,direct | 將direct這個地址中的數(shù)據(jù)與A中的數(shù)據(jù)相加并將結(jié)果存放在A |
| ADD A,@Ri | Ri存放了一個地址,將該地址的數(shù)據(jù)與A中的數(shù)據(jù)相加并將結(jié)果存放在A中 |
| ADD A,#data | 將data與A中的數(shù)據(jù)相加并將結(jié)果存放在A中 |
帶進位位加法指令
| ADDC A,Rn | 將A中的數(shù)據(jù),Rn中的數(shù)據(jù)和進位位Cy相加并將結(jié)果存放在A中 |
| ADDC A,direct | 將direct這個地址中的數(shù)據(jù),A中的數(shù)據(jù)和進位位Cy相加并將結(jié)果存放在A中 |
| ADDC A,@Ri | Ri存放了一個地址,將該地址的數(shù)據(jù),A中的數(shù)據(jù)和進位位Cy相加并將結(jié)果存放在A中 |
| ADDC A,#data | 將data與A中的數(shù)據(jù)相加并將結(jié)果存放在A中 |
注:ADDC加法指令常用于多字節(jié)加法運算中,例如16位數(shù),其低8位可由ADD指令相加,相加的結(jié)果若大于255將發(fā)生進位,即Cy=1,在相加這兩個數(shù)的高8位時就必須加上這個進位位,故而使用ADDC指令。相加進位位,就比如說 0xff + 0x01,結(jié)果是0x0100,由于51單片機寄存器是8位的,那么相加的結(jié)果只能將低8位存入寄存器中,結(jié)果便是0,但此時發(fā)生了進位,進位位Cy=1。
減法指令
| SUBB A,Rn | 用A中的值減去Rn中的值再減去進位位Cy并將結(jié)果存放在A中 |
| SUBB A,direct | 用A中的值減去direct這個地址中的值再減去進位位Cy并將結(jié)果存放在A中 |
| SUBB A,@Ri | Ri中存放了一個地址,用A中的值減去這個地址中的值再減去進位位Cy并將結(jié)果存放在A中 |
| SUBB A,#data | 用A中的值減去data再減去進位位Cy并將結(jié)果存放在A中 |
注:一般在用減法時先將進位位Cy清零 , CLR C
加1指令
| INC A | A中的值加1并將結(jié)果存放在A中 |
| INC Rn | Rn中的值加1并將結(jié)果存放在Rn中 |
| INC direct | 將direct這個地址中的值加1并將結(jié)果存在direct這個地址中 |
| INC @Ri | Ri中存放了一個地址,將該地址中的數(shù)據(jù)加1并將結(jié)果仍存在這個地址中 |
| INC DPTR | DPTR指針指向的數(shù)據(jù)加1并存在DPTR中 |
減一指令
| DEC A | A中的值減1并將結(jié)果存放在A中 |
| DEC Rn | Rn中的值減1并將結(jié)果存放在Rn中 |
| DEC direct | 將direct這個地址中的數(shù)據(jù)減1并將結(jié)果存放在direct這個地址中 |
| DEC @Ri | Ri中存放了一個地址,將該地址中的數(shù)據(jù)減1并將結(jié)果存放在這個地址中 |
乘除法指令
| MUL AB | 將A中的值與B中的值相乘,積的高位存在B中,低位存在A中 |
| DIV AB | 用A中的值除以B中的值,商存在A中,余數(shù)存在B中 |
邏輯運算類指令
邏輯與指令
| ANL A,direct | 將A中的值與direct這個地址中的值相與并將結(jié)果存在A中 |
| ANL A,Rn | 將A中的值與Rn中的值相與并將結(jié)果存在A中 |
| ANL A,@Ri | Ri中存放了一個地址,將該地址中的數(shù)據(jù)與A中的值相與并將結(jié)果存在A中 |
| ANL A,#data | 將A中的值與data相與并將結(jié)果存在A中 |
| ANL direct,A | 將direct這個地址中的值與A中的值相與并將結(jié)果存在direct這個地址中 |
| ANL direct,#data | 將direct這個地址中的值與data相與并將結(jié)果存在direct這個地址中 |
邏輯或指令
| ORL A,direct | 將A中的值與direct這個地址中的值相或并將結(jié)果存在A中 |
| ORL A,Rn | 將A中的值與Rn中的值相或并將結(jié)果存在A中 |
| ORL A,@Ri | Ri中存放了一個地址,將該地址中的數(shù)據(jù)與A中的值相或并將結(jié)果存在A中 |
| ORL A,#data | 將A中的值與data相或并將結(jié)果存在A中 |
| ORL direct,A | 將direct這個地址中的值與A中的值相或并將結(jié)果存在direct這個地址中 |
| ORL direct,#data | 將direct這個地址中的值與data相或并將結(jié)果存在direct這個地址中 |
邏輯異或指令
| XRL A,direct | 將A中的值與direct這個地址中的值相異或并將結(jié)果存在A中 |
| XRL A,Rn | 將A中的值與Rn中的值相異或并將結(jié)果存在A中 |
| XRL A,@Ri | Ri中存放了一個地址,將該地址中的數(shù)據(jù)與A中的值相異或并將結(jié)果存在A中 |
| XRL A,#data | 將A中的值與data相異或并將結(jié)果存在A中 |
| XRL direct,A | 將direct這個地址中的值與A中的值相異或并將結(jié)果存在direct這個地址中 |
| XRL direct,#data | 將direct這個地址中的值與data相異或并將結(jié)果存在direct這個地址中 |
循環(huán)移位指令
| RL A | 將A中的值按二進制循環(huán)左移,即第0位變?yōu)榈?位,以此類推,第7位變?yōu)榈?位 |
| RLC A | 帶進位循環(huán)左移,即進位位Cy變?yōu)锳中的值的第0位,原第0位變?yōu)榈?為,以此類推,第7位變?yōu)闃酥疚籆y |
| RR A | 將A中的值按二進制循環(huán)右移,即第7位變?yōu)榈?位,以此類推,第0位變?yōu)榈?位 |
| RLC A | 帶進位循環(huán)右移,即進位位Cy變?yōu)锳中的值的第7位,原第7位變?yōu)榈?位,以此類推,第0位變?yōu)闃酥疚籆y |
位操作類指令
注:在單片機中要對某個引腳進行操作,這個引腳就是一個位bit,例如將P1.1引腳置1,可用 SETB P1.1
位傳送指令
| MOV C,bit | 將bit的值傳送到標志位Cy中 |
| MOV bit,C | 將標志位Cy的值傳送到bit中 |
位置位和位復(fù)位指令
| CLR C | 將標志位Cy清0 |
| CLR bit | 將bit清0 |
| SETB C | 將標志位Cy置1 |
| SETB bit | 將bit置1 |
位運算指令
| ANL C,bit | 將標志位Cy與bit相與并將結(jié)果存到標志位Cy中 |
| ANL C,/bit | 將bit取反和標志位Cy相與并將結(jié)果存到標志位Cy中 |
| ORL C,bit | 將標志位Cy與bit相或并將結(jié)果存到標志位Cy中 |
| ORL C,/bit | 將bit取反和標志位Cy相或并將結(jié)果存到標志位Cy中 |
| CPL C | 將標志位Cy取反 |
| CPL bit | 將bit取反 |
位轉(zhuǎn)移指令
| JB bit,rel | 如果bit的值位1,則程序跳到當(dāng)前指令地址+rel這個位置繼續(xù)執(zhí)行,否則順序執(zhí)行 |
| JNB bit ,rel | 如果bit的值位0,則程序跳到當(dāng)前指令地址+rel這個位置繼續(xù)執(zhí)行 ,否則順序執(zhí)行 |
| JBC bit ,erl | 如果bit的值位1,則程序跳到當(dāng)前指令地址+rel這個位置繼續(xù)執(zhí)行并將bit清0,否則順序執(zhí)行 |
判斷Cy標志指令
| JC dst | dst表示一個標識符,如果Cy的值為1,程序跳到dst所標識的位置繼續(xù)執(zhí)行 ,否則順序執(zhí)行 |
| JNC dst | dst表示一個標識符,如果Cy的值不為1,程序跳到dst所標識的位置繼續(xù)執(zhí)行 ,否則順序執(zhí)行 |
例:
SETB C JC dst MOV A, #01H dst: MOV A, #02H END控制轉(zhuǎn)移類指令
無條件轉(zhuǎn)移指令
| LJMP dst | dst表示一個標識符,程序無條件跳轉(zhuǎn)到dst這個位置繼續(xù)執(zhí)行 | 任意位置 |
| AJMP dst | dst表示一個標識符,程序無條件跳轉(zhuǎn)到dst這個位置繼續(xù)執(zhí)行 | 2KB |
| SJMP dst | dst表示一個標識符,程序無條件跳轉(zhuǎn)到dst這個位置繼續(xù)執(zhí)行 | -128~127字節(jié)以內(nèi) |
| JMP @A+DPTR | 程序無條件跳轉(zhuǎn)到A與DPTR和這個地址位置開始執(zhí)行 | 64KB |
例:
MOV A, #03H LJMP dst MOV A, #01H dst: MOV A, #02H END條件轉(zhuǎn)移指令
| JZ dst | dst是一個標識符,如果A的值為0,程序跳轉(zhuǎn)到dst這個位置開始執(zhí)行,否則順序執(zhí)行 | -128~127字節(jié) |
| JNZ dst | dst是一個標識符,如果A的值不為1,程序跳轉(zhuǎn)到dst這個位置開始執(zhí)行,否則順序執(zhí)行 | -128~127字節(jié) |
| CJNE A,#data,dst | dst是一個標識符,如果A的值與data不相等,程序跳轉(zhuǎn)到dst這個位置開始執(zhí)行,否則順序執(zhí)行 ;如果A的值小于data,Cy=1,否則Cy=0 | -128~127字節(jié) |
| CJNE Rn,#data,dst | dst是一個標識符,如果Rn的值與data不相等,程序跳轉(zhuǎn)到dst這個位置開始執(zhí)行,否則順序執(zhí)行 ;如果A的值小于data,Cy=1,否則Cy=0 | -128~127字節(jié) |
| CJNE @Ri,#data,dst | dst是一個標識符,Ri存放了一個地址,如果這個地址存放的值與data不相等,程序跳轉(zhuǎn)到dst這個位置開始執(zhí)行,否則順序執(zhí)行 ;如果這個地址存放的值小于data,Cy=1,否則Cy=0 | -128~127字節(jié) |
| CJNE A,direct,dst | dst是一個標識符,如果A的值與direct的值不相等,程序跳轉(zhuǎn)到dst這個位置開始執(zhí)行,否則順序執(zhí)行 ;如果A的值小于direct的值,Cy=1,否則Cy=0 | -128~127字節(jié) |
| DJNZ Rn,dst | dst是一個標識符,將Rn的值先減1,如果此時Rn的值不為0,程序跳轉(zhuǎn)到dst這個位置開始執(zhí)行,否則順序執(zhí)行,常用作循環(huán)中 | -128~127字節(jié) |
| DJNZ direct,dst | dst是一個標識符,將direct這個地址的值先減1,如果此時direct這個地址的值不為0,程序跳轉(zhuǎn)到dst這個位置開始執(zhí)行,否則順序執(zhí)行 | -128~127字節(jié) |
例:
MOV A, #02H JZ dst MOV B, #01H dst: MOV B, #02H END調(diào)用和返回指令
| ACALL name | name表示子程序名,該指令表示調(diào)用子程序 | 2KB |
| LCALL name | name表示子程序名,該指令表示調(diào)用子程序 | 任意位置 |
| RET | 該指令表示調(diào)用子程序結(jié)束,子程序返回 | |
| RETI | 該指令表示中斷結(jié)束,中斷返回 |
例:
MOV A, #02H MOV B, #03H ACALL ADD_AB MOV R0, A SJMP $ //程序卡在這個位置ADD_AB: ADD A, B RETEND空操作
| NOP | 空操作 | 1 |
偽指令
ORG
ORG 1000H MOV A,#00H規(guī)定程序塊或數(shù)據(jù)塊存放的起始地址,示例中表示MOV A,#00H存放在1000H開始的單元中
END
匯編語言源程序結(jié)束標志
DB
ORG 1000H TAB: DB 02H,'B',"abc"將指令后的數(shù)據(jù)依次存放在指定的地址單元中。示例中TAB的地址為1000H,故而從該地址開始的單元依次存放02H,B的ASCII碼,a的ASCII碼,b的ASCII碼,c的ASCII碼
DW
ORG 1000H TAB: DW 3000H, 80H該指令后的數(shù)據(jù)為2個字節(jié),存放數(shù)據(jù)時類似DB,高位在前,低位在后。示例中TAB的地址為1000H,那么1000H存放30H,1001H存放00H,1002H存放00H,1003H存放80H
DS
ORG 1000H TAB: DS 1FH該指令用于保留存儲單元用作備用空間,示例中TAB的地址為1000H,,從1000H開始預(yù)留32個存儲字節(jié)空間(1000H~101FH)
EQU
DLY: EQU 3200H TAB: EQU DLY將該指令后的值賦給本語句的標號。示例中:DLY的地址是3200H,并將TAB的地址設(shè)置為DLY的地址,即TAB的地址也是3200H
BIT
DLY1: BIT 31H DIY2: BIT 32H將位地址賦給本語句的標號,示例中:DLY1和DLY2當(dāng)作位地址31H和32H。
總結(jié)
- 上一篇: 全志A20 刷入Ubuntu/Debia
- 下一篇: 教育编程语言(转)