1. 程式人生 > >一些常用匯編指令的注意事項

一些常用匯編指令的注意事項

資料傳送指令
MOV:暫存器之間傳送注意,源和目的不能同時是段暫存器;程式碼段暫存器CS不能作為目的;指令指標IP不能作為源和目的。立即數不能直接傳送段暫存器。 源和目的運算元型別要一致;除了串操作指令外,源和目的不能同時是儲存器運算元。
XCHG交換指令:運算元可以是通用暫存器和儲存單元,但不包括段暫存器,也不能同時是儲存單元,還不能有立即數。
LEA   16位暫存器   儲存器運算元 傳送有效地址指令:必須是一個16位暫存器和儲存器運算元。
LDS   16位暫存器 儲存器運算元   傳送儲存器運算元32位地址,它的16位偏移地址送16位暫存器,16位段基值送入DS中。
LES :同上,只是16位段基址送ES中。

堆疊操作指令
PUSH 運算元,運算元不能使用立即數,
POP 運算元, 運算元不能是CS和立即數

標誌操作指令
LAHF:把標誌暫存器低8位,符號SF,零ZF,輔助進位AF,奇偶PF,進位CF傳送到AH指定的位。不影響標誌位。
SAHF:與上相反,把AH中的標誌位傳送回標誌暫存器。
PUSHF:把標誌暫存器內容壓入棧頂。
POPF:把棧頂的一個位元組傳送到標誌暫存器中。
CLC:進位位清零。
STC:進位位為1。
CMC:進位位取反。
CLD:使方向標誌DF為零,在執行串操作中,使地址按遞增方式變化。
STD:DF為1。
CLI:清中斷允許標誌IF。Cpu不相應來自外部裝置的可遮蔽中斷。
STI:IF為1。

加減運算指令
注意: 對於此類運算只有通用暫存器和儲存單元可以存放運算結果。如果參與運算的運算元有兩個,最多隻能有一個儲存器運算元並且它們的型別必須一致。
ADD。
ADC:把進位CF中的數值加上去。
INC:加1指令
SUB。
SBB:把進位CF中數值減去。
DEC:減1指令。
NEG 運算元:取補指令,即用0減去運算元再送回運算元。
CMP:比較指令,完成運算元1減去運算元2,結果不送運算元1,但影響標誌位。可根據ZF(零)是否被置1判斷相等;如果兩者是無符號數,可根據CF判 斷大小;如果兩者是有符號數,要根據SF和OF判斷大小。
乘除運算指令
MUL 運算元 :無符號數乘法指令。運算元不能是立即數。運算元是位元組與AL中的無符號數相乘,16位結果送AX中。若位元組,則與AX乘,結果高16送DX,低16送 AX。如乘積高半部分不為零,則CF、OF為1,否則為0。所以CF和OF表示AH或DX中含有結果的有效數。
IMUL 運算元 :有符號數乘法指令。基本與MUL相同。
DIV 運算元 :被除數是在AX(除數8位)或者DX和AX(除數16位),運算元不能是立即數。如果除數是0,或者在8(16)位除數時商超過8(16)位,則認為是 溢位,引起0號中斷。IDIV:有符號除法指令,當除數為0,活著商太大,太小(位元組超過127,-127字超過32767,-32767)時,引起0號 中斷。

符號擴充套件指令
CBW,CWD: 把AL中的符號擴充套件到暫存器AH中,不影響各標誌位。CWD則把AX中的符號擴充套件到DX,同樣不影響標誌位。注意:在無符號數除之前,不宜用這兩條指令, 一般採用XOR清高8位或高16位。

邏輯運算指令與位移指令
注意:只能有一個儲存器運算元;只有通用暫存器或儲存器運算元可作為目的運算元,用於存放結果;運算元的型別必須一致。
NOT:取反,不影響標誌位。
AND 運算元1 運算元2:操作結果送錯作數1,標誌CF(進位)、OF(溢位)清0,PF(奇偶)ZF(0標誌) SF(符號)反映運算結果,AF(輔助進位)未定義。自己與自己AND值不變,她主要用於將運算元中與1相與的位保持不變,與0相與清0。(都為1時為 1)
OR 運算元1 運算元2:自己與自己OR值不變,CF(進位)、OF(溢位)清0,PF(奇偶)ZF(0標誌)SF(符號)反映運算結果,AF(輔助進位)未定義。她使 用於將若干位置1:與1相或為1,保持不變的位與0相或。(都為0時為0)
XOR 運算元1 運算元2:自己與自己異或結果為0,標誌CF(進位)、OF(溢位)清0,PF(奇偶)ZF(0)SF(符號)反映運算結果,AF(輔助進位)未定義。主 要用於將若干位取反的操作:與1異或取反,與0異或保持不變。(相同為0,不同為1)
TEST 運算元1 運算元2:測試指令,和AND相同,但結果不送運算元1,各標誌位同AND操作。

位移指令
SAL/SHL 運算元 1或CL:算術左移與邏輯左移進行相同的動作,運算元是通用暫存器或者儲存器運算元,位移數為1或為CL;最高位移CF(進位),右邊用0補位。左移一次 相當源運算元乘2。
SAR 運算元 1或CL:算術右移,位移數為1或為CL;運算元是通用暫存器或者儲存器運算元,左符號位保持不變,移出最低位進CF(進位)。相當源運算元除2。
SHR 運算元 1或CL :邏輯右移,運算元是通用暫存器或者儲存器運算元,位移數為1或為CL;左邊用0補足,移出的最低位進CF(進位)對於無符號數,右移一位相當於除2。
ROL/ROR 運算元 1或CL: 不帶進位左移/右移,運算元是通用暫存器或者儲存器運算元,位移數為1或為CL。
RCL/RCR 運算元 1或CL: 帶進位左移/右移,CF(進位)參與迴圈。運算元是通用暫存器或者儲存器運算元,位移數為1或為CL。

轉移指令
注意:由於程式碼段可分為多個段,所以根據轉移時是否重置程式碼段暫存器CS內容,可分為段內轉移和段間轉移。段內轉移僅重置IP的轉移,轉移後指令仍在同一 程式碼段中。段間轉移重置CS,所以轉移後繼續執行的指令在另一個段中。
JMP 標號 :無條件跳轉到標號位置執行,段內直接轉移指令。地址差用一個位元組表示為短轉移,用一個字表示為近轉移。
JMP 通用暫存器/儲存單元:無條件段間間接轉移指令,運算元給定的是目標地址處。
JMP FAR PTR 標號:無條件段間直接轉移指令,她的具體動作是把指令中包含的目標地址的段值和偏移分別置茹CS和IP。
JMP 運算元:無條件段間間接轉移指令,運算元是雙字儲存單元,給定目標地址,低位元組送IP,高位元組送CS。
條件轉移指令:所有的條件轉移指令都是段內轉移。她是由J加上相應的含義字母組合成。有符號數關係G(大於),E(等於),L(小於);無符號數關係 A(高於)、E(等於)和B(低於);字母N表示“不”:NB(不小於),NE(不等於)。

迴圈指令
LOOP 標號:她使暫存器CX減1,若結果不等於0則轉到標號,否則順序執行LOOP指令後的指令。最多迴圈65536次。
LOOPE/LOOPZ 標號:等於/全零迴圈指令。CX的值減1,如果結果不等於0,並且ZF(0標誌)等於1,則轉移到標號。
LOOPNE/LOOPNZ 標號:不等於/非零迴圈指令,CX的值減1,如果結果不等於0,並且ZF(0標誌)等於0,則跳轉到標號。
JCXZ 標號: 該指令實現當暫存器CX的值等於0轉移到標號,否則順序執行。通常該指令用在迴圈開始前,以便在迴圈次數位0時,跳過迴圈體