基于MCS-51內(nèi)核的匯編學(xué)習(xí)筆記
數(shù)據(jù)傳送類(lèi)指令:
MOV 訪問(wèn)內(nèi)部數(shù)據(jù)儲(chǔ)存器
MOVX 訪問(wèn)外部數(shù)據(jù)儲(chǔ)存器
MOVC 訪問(wèn)ROM儲(chǔ)存器
XCH 整字節(jié)交換
XCHD 半字節(jié)交換(低四位)
PUSH 設(shè)置堆棧指針寄存器SP所指向的內(nèi)容(把字壓入堆棧)
POP 把字彈出堆棧;
SWAP 高低字節(jié)交換指令;
數(shù)據(jù)傳送指令不影響標(biāo)志,只有一有堆棧操作可以直接修改程序狀態(tài)字PSW,這樣可以是某些標(biāo)志位發(fā)生變化;
格式:MOV 操作數(shù) 目標(biāo)操作數(shù)
操作數(shù):A,Rn,direct(直接地址),@Ri(間接地址),#data;
源操作數(shù):A,Rn,direct(直接地址),@Ri(間接地址);
提醒:MOV @DPTR,#data; 將16位的數(shù)據(jù)存入數(shù)據(jù)指針寄存器DPTR所指向的地址中;
算術(shù)運(yùn)算類(lèi)指令:
只能是8位
ADD 不帶進(jìn)位相加
ADDC 帶進(jìn)位相加
INC 加1指令
SUBB 減法指令,操作數(shù)-源操作數(shù)-CY
DEC 減1指令
DAA 十進(jìn)制調(diào)整指令;
MUL 乘法指令
DIV 除法指令
算術(shù)標(biāo)志指令將會(huì)影響進(jìn)位標(biāo)志CY,輔助進(jìn)位標(biāo)志AC,溢出標(biāo)志OV:運(yùn)算時(shí),如果D7進(jìn)位,則CY被置1,否則清零;如果D3位有進(jìn)位,則AC將會(huì)被置1,否則會(huì)被清零;對(duì)于無(wú)符號(hào)數(shù)相加,若CY置1,則表示D7進(jìn)位溢出(大于255);對(duì)于無(wú)符號(hào)數(shù),若和數(shù)溢出(大于127或小于-128),則OV被置1;
邏輯運(yùn)算指令:
CLR 清0操作數(shù)
CPL 對(duì)操作數(shù)按位取反
ANL 與
ORL 或
XRL 異或
RL 操作數(shù)左移1位
RLC 帶進(jìn)位標(biāo)志左移1位
RR 右移一位
RRC 帶進(jìn)位標(biāo)志右移一位
控制轉(zhuǎn)移指令
AJMP
LJMP
SJMP
JMP
ACALL
LCALL
JZ
JNZ
CJNE
DJNZ
1條件轉(zhuǎn)移指令
絕對(duì)轉(zhuǎn)移指令 AJMP addr11;PC→PC+2+addr11
2KB范圍內(nèi)無(wú)條件跳轉(zhuǎn)指令,執(zhí)行該指令時(shí),先將PC+2,然后再將addr11的值送入PC10~PC0,而PC11~P15保持不變,這樣得到跳轉(zhuǎn)的目的地址。
相對(duì)轉(zhuǎn)移指令 SJMP rel;PC→PC+2+rel
執(zhí)行指令時(shí),先將PC+2,再把指令中帶符號(hào)的偏移量加上PC上,得到跳轉(zhuǎn)的目的地地址送入PC;目標(biāo)地址=源地址+2+rel。源地址是SJMP指令操作碼(PC)的所在地;相對(duì)偏移量rel是一個(gè)用補(bǔ)碼表示的8位帶符號(hào)數(shù),轉(zhuǎn)移范圍為當(dāng)前PC的值的+127~-128共256個(gè)單元;
若要求用動(dòng)態(tài)停機(jī)可以用SIMP指令來(lái)實(shí)現(xiàn):”HERE:SJMP HERE;”或者”HERE:SJMP;”表示本指令所在單元地址 ($讀dollar)
長(zhǎng)跳轉(zhuǎn)指令 addr16; addr16→PC
執(zhí)行指令時(shí),addr16可以指向64KB程序儲(chǔ)存器中的任何地址,并且不影響標(biāo)志位;
間接轉(zhuǎn)移指令(散轉(zhuǎn)指令)
JMP @A+DPTR; A+DPTR→PC
將A中的8位無(wú)符號(hào)數(shù)和數(shù)據(jù)指針DPTR的16位數(shù)相加,然后將之后送到PC,并不改變A和DPTR的值,也不影響標(biāo)志;間接轉(zhuǎn)移指令特點(diǎn)是采用變址方式實(shí)現(xiàn)無(wú)條件轉(zhuǎn)移,特點(diǎn)是轉(zhuǎn)移地址可以在程序運(yùn)行中加以改變,從可以實(shí)現(xiàn)多支轉(zhuǎn)移。所以一條指令可以完成多條條件判斷轉(zhuǎn)移指令的功能;
2 條件轉(zhuǎn)移指令
JZ rel;A= 0轉(zhuǎn)移
JNZ rel;A≠0轉(zhuǎn)移;
這種類(lèi)轉(zhuǎn)移一句累加器A的值是否為0。滿(mǎn)足條件時(shí)轉(zhuǎn)移(這個(gè)轉(zhuǎn)移就相當(dāng)于一個(gè)相對(duì)轉(zhuǎn)移指令PC+2+rel→PC),條件不滿(mǎn)足時(shí)則順序執(zhí)行下面一條指令。
3 比較轉(zhuǎn)移指令
MCS51沒(méi)有專(zhuān)門(mén)的比較指令,但提供了下面4條比較不相等轉(zhuǎn)移指令:
CJNE A,direct,rel; A≠direct轉(zhuǎn)移
CJNE A,#data,rel; A≠data轉(zhuǎn)移
CJNE Rn,#data,rel; Rn≠data轉(zhuǎn)移
CJNE @Ri,#data,rel; Ri≠data轉(zhuǎn)移
比較操作數(shù)和源操作數(shù)的大小,如果不想等就轉(zhuǎn)移。相等的話(huà)就不轉(zhuǎn)移,繼續(xù)執(zhí)行下面的程序;轉(zhuǎn)移地址的計(jì)算計(jì)算方法與上述兩條指令相同。如果第一個(gè)操作數(shù)(無(wú)符號(hào)整數(shù))小于第二個(gè)操作數(shù),CY將會(huì)被置1,否則0,但是不影響任何操作數(shù)的內(nèi)容;
4 減1不為0轉(zhuǎn)移指令
DJNZ Rn,rel;Rn-1→Rn ≠0轉(zhuǎn)移
DJNZ direct,rel;direct-1→direct ≠0轉(zhuǎn)移
這兩條指令把原操作數(shù)減1,結(jié)果送還到源操作數(shù)中,如果結(jié)果不為0則轉(zhuǎn)移;
5 調(diào)用及返回指令
絕對(duì)調(diào)用指令 ACALL addr11
長(zhǎng)調(diào)用指令 LCALL addr16
子程序返回指令 RET
中斷返回指令 RET1
空操作指令 NOP; PC+1→PC
6 位操作指令
操作范圍為內(nèi)部RAM的位尋址區(qū)20H~2FH單元中連續(xù)的128位,以及特殊功能寄存器中可以進(jìn)行位尋址的各位;位地址為(00H~7F);
位操作指令包括布爾變量的傳送,邏輯運(yùn)算,控制轉(zhuǎn)移等指令,共有17條指令,所用到的助記符有MOV,CLR,CPL,SETB,ANL,ORL,JC,JB,JNB,JBC共11種;
在布爾處理機(jī)制中,進(jìn)位標(biāo)志CY的作用與CPU中的累加器A,通過(guò)CY完成位的傳送和邏輯運(yùn)算。
指令中位地址的表達(dá)方式有以下幾種:直接地址方式(90H),點(diǎn)操作符方式(IE.0),位名稱(chēng)方式(EX0)等;
位數(shù)據(jù)傳送指令MOVC,bit;bit→CYMOVbit,C;CY→bit位變量修改指令CLRC;0→CYCLRbit;0→bit;CPLbit;/bit→bitCPLC;/CY→CYSETBC;1→CY;SETBbit;1→1位變量邏輯與指令A(yù)NLC,bit;(CY)^(bit)→CYANLC,/bit;(CY)^(/bit)→CY位變量邏輯或指令ORLC,bit;(CY)|(bit)→CYORLC,/bit;(CY)|(/bit)→CY位變量條件條件轉(zhuǎn)移指令JCrel若CY=1,則轉(zhuǎn)移PC+2+rel→PCJNCrel若CY=0,則轉(zhuǎn)移PC+2+rel→PCJBbit,rel若bit=1,則轉(zhuǎn)移,PC+3+rel→PCJNBbit,rel若bit=0,則轉(zhuǎn)移,PC+3+rel→PCJBCbit,rel若bit=1,則轉(zhuǎn)移,PC+3+rel→PC,并且0→bit;(注意:只有JBC指令執(zhí)行后,bit位被清0)