資料傳送指令
傳送指令MOV
格式如下:MOV Reg/Mem,Reg/Mem/Imm
寄存器Reg 存儲器Mem 立即數Imm
注意:①兩個操作數的資料類型要相同,要同為8位、16位
②兩個操作數不能同時為段寄存器,
③代碼段寄存器CS不能為目的操作數,但可作為源操作數
④立即數不能直接傳給段寄存器
⑤立即數不能作為目的操作數
⑥指令指針IP,不能作為MOV指令的操作數
⑦兩個操作數不能同時是存儲單元

傳送—— 填充指令
是把位數短的資料傳送給位數長的目的操作數
MOVSX/MOVZX Reg/Mem, Reg/Mem/Imm
MOVSX用符号位填充,MOVZX用0來填充
交換指令XCHG
XCHG Reg/Mem,Reg/Mem
作用是交換兩個寄存器,寄存器不能是段寄存器,兩個操作數不能同時為記憶體變量
取有效位址指令LEA
指令LEA是把一個記憶體變量的有效位址送給指定的寄存器,格式:LEA Reg,Mem
LEA指令和OFFSET的聯系與差別
相同:都是取偏移指令的操作
注意事項:1.lea、offset指令的源操作數必須是記憶體操作數
2.lea、offset指令的目的操作數必須是16位寄存器
3.lea指令不影響狀态标志寄存器内容。
差別:
4.offset指令的源操作數不能是下标(類似數組),lea可以。
5.offset在彙編時生效,lea在指令執行時才生效。
取段寄存器指令
LDS/LES Reg,Mem
該組指令的功能是把記憶體單元的一個低字傳送給指令中指定的16位寄存器,把随後的一個高字傳給相應的段寄存器。
若Reg是16位寄存器,那麼Mem必須是32位指針
進棧操作
PUSH Reg/Mem
出棧操作
POP Reg/Mem
轉換指令XLAT
無操作數,但有兩個隐含操作數BX和AL
指令格式如下:XLAT/XLATB,其功能是把BX的值作為記憶體位元組數首位址,下标為AL的數組元素的值傳送給AL
FLAG寄存器
- ZF标志,零标志:計算結果為0置1,不為0置0
- PF标志,奇偶标志:計算結果二進制數有奇數個1還是偶數個1,奇數個1寫0,偶數個1寫1
- SF标記,符号标記:運算結果為正,置0;為負,置1
- CF标志,進位标志:最高位是否有進位或錯誤,有置1,沒有置0
- OF标志,溢出标志:8位數是否超過-128到127,是溢出置1
- AF标志,輔助進位标志,低4位是否向高4位進位或借位,是置1,否置0
算術運算指令
加法指令
1.ADD加法指令:把源操作數的值加到目的操作數
2.ADC帶進位加指令:把源操作數和進位标志CF一起加到目的操作數
3.INC指令:操作數的值加1
4.交換加指令XADD:先交換兩個操作數的值,在鏡像加法運算
減法指令
1.SUB減法指令:從目的操作數中減去源操作數
2.SBB帶借位減法:把源操作數和标志位CF的值從目的操作數中一起減去
3.DEC減法:把源操作數的值減去1
4.求補指令NEG:改變操作數的正負号
乘法指令
MUL指令:隐含目的操作數,把源操作數和AL(AX)的值相乘儲存到AX(DX+AX)中
除法指令
DIV指令:
類型轉換指令
系統提供了四條資料類型轉換指令:CBW、CWD、CWDE、CDQ
CBW位元組轉換為字指令:隐含操作數AH和AL,其功能是用AL的符号位去填充AH
CWD字轉換為雙字指令:隐含操作數DX和AX,其功能是用AX的符号位去填充DX
邏輯運算指令
邏輯與指令
指令格式:AND Reg/Mem,Reg/Mem/Imm
邏輯或指令
指令格式:OR Reg/Mem,Reg/Mem/Imm
邏輯非
指令格式:NOT Reg/Mem
TEST指令
格式:TEST Reg/Mem,Reg/Mem/Imm
功能是對兩個操作數進行邏輯與運算,但結果不送至目的操作數,隻是影響狀态标志
作用是檢測一些條件是否滿足,但又不希望改變操作數,即使用于檢查一個位元組或字中的某些特定位是否有一位為1
移位指令
1.SHL指令(邏輯左移)
相當于将數倍增
2.SHR指令(邏輯右移)
将一個無符号數向右移動,左邊出現空位補0,右邊低位移至CF
3.SAL指令(算術左移)
SAL指令同SHL,實際上SHL和SAL是同一條指令的兩種助記符,它們執行的操作完全一樣。
4.SAR指令(算術右移)
SAR類似于SHR,SAR同SHR的差別是:SHR連同符号位一起右移,左邊最高位出現的空位補0;而SAR右移時符号位不動,左邊出現的空位補上符号位的值。
其中值得注意的一點是:如果目的操作數是負數,且其中具有1的位數移出後,則SAR指令産生的結果與用整數IDIV指令産生的結果不一樣。
例如:-5經SAR右移之後得-3,IDIV之後為-2
5.ROL指令(循環左移)
功能:每執行一次,把最高位移到最低位,同時還把最高位移到CF
6.ROR指令(循環右移)
與ROL指令類似
7.RCL指令(通過進位循環左移)
RCL指令對目的操作數1位元組或字中的各位循環左移,進位标志CF被看作目的操作數的“一部分”。每執行一次,CF的值循環移入目的操作數的低位,而目的操作數的最高位移入CF。
8.RCR指令(通過進位循環右移)
RCR與RCL類似,
比較指令CMP
功能:用第二個操作數去減第一個操作數,并根據所得的差設定有關标志位,為随後的條件轉移指令提供條件,但并不儲存該差,是以不會改變指令中的操作數。
循環指令
CX寄存器中存放循環次數,一般循環跳轉是,CX先減1,後判斷CX是否為0
LOOP 标号
相等或為零循環指令
LOOPE/LOOPZ 标号
LOOPNE/LOOPNZ 标号
循環計數器為零轉指令
轉移指令
1.無條件轉移指令JMP
格式:JMP 标号
2.條件轉移指令
字元串操作指令
字元串操作指令的實質是對一片連續存儲單元進行處理,這片存儲單元是隐含指針DS:SI或ES:DI來指定的。
字元串操作指令可對記憶體單元按位元組、字或雙字進行處理,并能根據操作對象的位元組數使變址寄存器SI和DI增減1、2、4.
具體規定如下:
(1)當DF=0時,變址寄存器SI(和DI)增加1、2、4
(2)當DF=1時,變址寄存器SI(和DI)減少1、2、4
執行個體:字元串輸出
方法1:利用40号中斷功能,BX=1,CX=輸出字元個數,DS:DX指向要輸出的串首
方法2:利用9号中斷功能。DS:DX指向要輸出的串首,一直輸出到“$”結束。
字元串輸入
方法:利用OAH号中斷功能,DS:DX指向存入的首位址。其中,DS:DX内容是輸入的最大位元組數,是需要事先設定好的;DS:DX+1是實際輸入的位元組數,是輸入成功後的傳回值;DS:DX+2是真正的存入的内容首位置。
取字元串資料指令LODS
格式:LODS source ;source為字元串源位址
LODSB/LODSW ;位元組/字
功能:LODS指令将SI指向的源串元素根據其位址表達式的屬性來決定讀取一個位元組、字或雙字,将其傳送到AL,AX,同時根據DF和串的類型修改SI的内容使之指向串的下一個元素。
該指令不涉及目标串,故DI的值保持不變。一般使用LODS指令不加重複字首。
-存字元串資料置零STOS
格式:STOS 記憶體位址 ;記憶體位址為目标字元串的目的位址
STOSB/STOSW ;位元組/字
功能:STOS指令将累加器AL、AX或EAX的内容傳送到由ES:DI所指向的目的串中,同時根據DF和串的類型修改DI以指向下一個串元素。
注意:LODS,STOS指令都不影響狀态标志寄存器的狀态。
字元串傳送指令MOVS
格式:MOVS 目的串的目的位址;源字元串源位址
MOVSB/MOVSW ;位元組/字
功能:MOVS指令是把DS:SI所指向的位元組、字或雙字傳送給ES:DI所指向的記憶體單元,并根據标志位DF和串的類型修改寄存器DI和SI。指令的執行不影響任何标志位。
MOVS指令前可以加字首REP成為REP MOVS,其作用如同以下的指令序列:
L:MOVS
LOOP L
字元串比較指令CMPS
格式:CMPS source,destination
CMPSB/SMPSW
CMPSD
功能:CMPS指令是把DS:SI和ES:DI指向的位元組、字或雙字的值相減,将結果反映到狀态标志位上,而不送至任何一個操作數。同時修改SI和DI使之指向下一個元素。标志位AF,CF,OF,PF,SF和ZF反映了目的串和源串對應元素之間的關系。
字元串掃描指令SCAS
格式:SCAS destination ;destination 為掃描累加
SCASB/SCASW ;器值的字元串位址
SCASD ;位元組/字
功能:SCAS指令從累加器AL,AX中減去由ES:DI指向的目标串中的元素,結果不送到任何地方,隻改變狀态标志位;同時,根據DF和串的類型修改DI,使之指向串的下一個元素。受影響的标志位包括AF,CF,OD,PF,SF和ZF.
十分重要:
實作一個字元的輸入
AH=1
INT 21H
AL=輸入的字元
實作一個字元的輸出
AH=2
DL=輸出的字元
INT 21H