一系羞、數(shù)據(jù)傳送指令
1. 通用數(shù)據(jù)傳送指令
通用表示符號(hào)
data:立即數(shù)
DST:目的操作數(shù)
SRC:源操作數(shù)
reg:寄存器
segreg:段寄存器
mem:存儲(chǔ)器
ac:累加器
MOV 傳送指令
格式:MOV DST,SRC
效果:(DST)←(SRC)
- 一張圖解釋MOV指令移動(dòng)方向
PUSH,POP 進(jìn)棧出棧指令
格式:PUSH DST
效果:(SP)←(SP)-2
???((SP)+1,(SP))←(SRC)
格式:POP DST
效果:(DST)←((SP)+1,(SP))
???(SP)←(SP)+2
- 堆棧段中地址是從高地址往低地址生長(zhǎng)的郭计,所以進(jìn)棧時(shí)SP要-2,出棧時(shí)SP要+2
- 操作的是堆棧段椒振,指針是SP
- 存取必須以字為單位
- PUSH和POP不影響標(biāo)志位
PUSHA 所有寄存器進(jìn)棧指令
POPA 所有寄存器出棧指令
格式:PUSHA
效果:將當(dāng)前AX,CX,DX,BX,SP,BP,SI,DI依次入棧
???(SP)←(SP)-16
格式:POPA
效果:寄存器DI,SI,BP,SP,BX,DX,CX,AX依次出棧
???(SP)←(SP)+16
- 為了讓SP后面的內(nèi)容順利出棧昭伸,棧中對(duì)應(yīng)SP的內(nèi)容并沒(méi)有真正送入SP寄存器中去
- 這兩條指令可以保存當(dāng)前寄存器的狀態(tài),之后要用的時(shí)候可以用POPA來(lái)恢復(fù)
XCHG 交換指令
格式:XCHG OPR1,OPR2
效果:(OPR1)?(OPR2)
- 必須有一個(gè)是在寄存器中
- 不能用段寄存器
2. 累加器專用傳送指令
IN OUT 輸入輸出指令
長(zhǎng)格式:IN AL,PORT 效果:(AL)←(PORT)
長(zhǎng)格式:IN AX,PORT 效果:(AL)←(PORT+1,PORT)
短格式:IN AL,DX 效果:(AL)←((DX))
短格式:IN AX,DX 效果:(AX)←((DX+1),(DX))
長(zhǎng)格式:OUT PORT,AL 效果:(PORT)←(AL)
長(zhǎng)格式:OUT PORT,AX 效果:(PORT+1,PORT)←(AX)
短格式:OUT DX,AL 效果:((DX))←(AL)
短格式:OUT DX,AX 效果:((DX+1),(DX))←(AX)
- 短格式和長(zhǎng)格式:前256個(gè)端口(0~FFH)可以直接在指令中指定澎迎,當(dāng)端口號(hào)≥256時(shí)勋乾,只能使用短格式,必須先把端口號(hào)放到DX中嗡善,然后再操作
- 含有AL的指令是傳字節(jié)辑莫,含有AX的是傳字,具體使用哪一種取決于外設(shè)端口寬度
XLAT 換碼指令
格式:XLAT OPR或
???XLAT
效果:(AL)←((BX)+(AL))
- 顧名思義罩引,它能將一種代碼轉(zhuǎn)換為另一種代碼各吨,要預(yù)先建立一個(gè)表格,在轉(zhuǎn)換之前袁铐,將表格的首地址存入BX揭蜒,這樣根據(jù)不同的AL值就能找到對(duì)應(yīng)的值
- OPR是表格的首地址(一般為符號(hào)地址),用于提高程序可讀性剔桨,程序執(zhí)行時(shí)還是按照BX來(lái)找首地址的屉更,所以不加也沒(méi)關(guān)系
3. 地址傳送指令
LEA 有效地址送寄存器指令
格式:LEA REG,SRC
效果:(REG)←SRC
- 將源操作數(shù)的有效地址傳送到指定的寄存器中,注意這里加不加括號(hào)的區(qū)別
- 目的操作數(shù)為16位寄存器洒缀,但是不能使用段寄存器
- 該指令不影響標(biāo)志位
LDS LES 指針?biāo)图拇嫫骱投渭拇嫫髦噶?/h5>
格式:LDS REG,SRC
效果:(REG)←(SRC)
???(SREG)←(SRC+2)
- 在存儲(chǔ)單元中找到16位偏移地址SRC的位置后瑰谜,把第一個(gè)字存入REG,第二個(gè)字存入DS
- 不影響標(biāo)志位
- LES和LDS類似树绩,只是把DS換成了ES
LAHF SAHF標(biāo)志寄存器傳送指令
首先萨脑,請(qǐng)熟悉一下這最復(fù)雜的寄存器FLAGS吧,這里每一位都代表了不同的含義饺饭,用來(lái)標(biāo)志狀態(tài)渤早。
好了,預(yù)熱完后瘫俊,我們開(kāi)始
格式:LAHF
效果:(AH)←(FLAGS低字節(jié))
- 將FLAGS寄存器的低八位放到AH寄存器中鹊杖,那到底是哪八位呢?這里的FLAG八位分別是這樣安排的(順序從大到锌秆俊):
FLAGS= [SF] [ZF] [0] [AF] [0] [PF] [1] [CF](二進(jìn)制八位)
7:SF
6:ZF
5:0
4:AF
3:0
2:PF
1:1
0:CF
可以看到骂蓖,這里的1,3,5的值都已經(jīng)定好了,無(wú)法修改 - 忘了什么是AH胸哥?想想AX的組成涯竟,AH高八位,AL第八位
格式:SAHF
效果:(FLAGS低字節(jié))←(AH)
- 和上面LAHF差不多,將AH傳入FLAGS的低字節(jié)庐船,其中第1,3,5位都是定好的改不了的
- 要是還看不懂往上翻
PUSHF 標(biāo)志進(jìn)棧指令
格式:PUSHF
效果:(SP)←(SP)-2
???((SP+1),(SP))←(FLAGS)
- 將FLAGS寄存器的十六位傳入指定的堆棧段中银酬,由于要傳入堆棧段,所以SP指針要提前-2空出16位的空間
格式:POPF
效果:((SP+1),(SP))
???(SP)←(SP)+2
- 從堆棧段傳一個(gè)字到FLAGS寄存器筐钟,由于堆棧段數(shù)據(jù)傳出揩瞪,傳送到FLAGS之后要將SP+2減少16位的空間
5. 類型轉(zhuǎn)換指令
格式:CBW
效果:將AL擴(kuò)展到AH。如果AL最高有效位為0篓冲,則AH=0李破;如果AL最高有效位為1,則AH=0FFH
- 在運(yùn)算的時(shí)候壹将,如果兩個(gè)數(shù)的位數(shù)不一樣的話嗤攻,就要進(jìn)行類型轉(zhuǎn)換,以確保運(yùn)算的正確性诽俯,比如八位的-1是AL=0FFH妇菱,當(dāng)它與16位數(shù)運(yùn)算時(shí),如果不擴(kuò)展位數(shù)暴区,那么就是AX=00FFH闯团,顯然會(huì)出問(wèn)題,擴(kuò)展了之后仙粱,AX=0FFFFH房交,就保證結(jié)果正確了
格式:CWD
效果:將AX擴(kuò)展到DX,形成DX:AX中的雙字伐割。如果AX最高有效位為0候味,則DX=0;如果AX最高有效位為1口猜,則DX=0FFFFH
二负溪、算術(shù)指令
1. 加法指令
ADD 加法指令
格式:ADD DST,SRC
效果:(DST)←(DST)+(SRC)
- 效果和高級(jí)語(yǔ)言中的賦值語(yǔ)句差不多,不過(guò)要注意運(yùn)算位數(shù)和溢出情況
- 影響條件標(biāo)志位
ADC 帶進(jìn)位加法指令
格式:ADC DST,SRC
效果:(DST)←(DST)+(SRC) +CF
- 把CF的值也加了進(jìn)去济炎,這樣就能實(shí)現(xiàn)大數(shù)加減,先用ADD把低位和低位相加辐真,然后進(jìn)位自然到了CF中须尚,再用ADC把高位、高位和標(biāo)志位相加
- 影響條件標(biāo)志位
INC 加一指令
格式:INC OPR
效果:(OPR)←(OPR)+1
- 影響條件標(biāo)志位(除CF以外)
XADD 交換并相加指令
格式:XADD DST,SRC
效果:TEMP=(SRC)+(DST)
???(SRC)←(DST)
???(DST)←TEMP
2. 減法指令
SUB 減法指令
格式:SUB DST,SRC
效果:(DST)←(DST)-(SRC)
- CF=1:減數(shù)>被減數(shù)侍咱;否則為0
- OF=1:兩數(shù)符號(hào)相反耐床,結(jié)果符號(hào)與減數(shù)相同;否則為0
SBB 帶借位減法指令
格式:SBB DST,SRC
效果:(DST)←(DST)-(SRC)-CF
- CF=1:減數(shù)>被減數(shù)楔脯;否則為0
- OF=1:兩數(shù)符號(hào)相反属愤,結(jié)果符號(hào)與減數(shù)相同员淫;否則為0
DEC 減一指令
格式:DEC OPR
效果:(OPR)←(OPR)-1
NEG 求補(bǔ)指令
格式:NEG OPR
效果:(OPR)←0FFFFH-(OPR)+1
- 條件碼按求補(bǔ)后的結(jié)果設(shè)置
- CF=0:操作數(shù)為0時(shí)
CMP 比較指令
格式:CMP OPR1,OPR2
效果:(OPR1)-(OPR2)
- 以上減法指令除DEC不影響CF標(biāo)志以外或颊,其它都影響條件標(biāo)志位
3. 乘法指令
MUL 無(wú)符號(hào)數(shù)乘法
IMUL 帶符號(hào)數(shù)乘法
格式:MUL SRC
格式:IMUL SRC
效果:字節(jié) (AX)←(AL)*(SRC)
???字(DX,AX)←(AX)*(SRC)
4. 除法指令
DIV 無(wú)符號(hào)數(shù)除法
IDIV 帶符號(hào)數(shù)除法
格式:DIV SRC
效果:16位數(shù)(AL)←(AX)/(SRC)的商
??????(AH)←(AX)/(SRC)的余數(shù)
???32位數(shù)(AX)←(DX,AX)/(SRC)的商
??????(DX)←(DX,AX)/(SRC)的余數(shù)
三茂装、邏輯指令
1. 邏輯運(yùn)算指令
AND 邏輯與
格式:AND DST,SRC
效果:(DST)←(DST)∧(SRC)
OR 邏輯或
格式:OR DST,SRC
效果:(DST)←(DST)∨(SRC)
NOT 邏輯非
格式:NOT OPR
效果:(OPR)←(非OPR)
- 不允許使用立即數(shù)
XOR 異或
格式:XOR DST,SRC
效果:(DST)←(DST)⊕(SRC)
TEST 測(cè)試
格式:TEST OPR1,OPR2
效果:(OPR)∧(OPR2)
- 這條指令結(jié)果不保存,會(huì)改變條件碼
- 源操作數(shù)不是立即數(shù):至少有一個(gè)操作數(shù)必須存放在寄存器中仿村,另一個(gè)操作數(shù)可以使用任意尋址方式
- NOT不影響操作數(shù)
- AND可以將某些位置0,OR將某些位置置1,TEST測(cè)試某些位置是否為1淹办,XOR將某些位置取反
2. 移位指令
SHL 邏輯左移
格式:SHL OPR,1/CL
效果:將OPR向左移1位或CL位,如果要移CL位恶复,先把移位次數(shù)置于CL中怜森,右邊多余的位用0補(bǔ),溢出位放在CF中
- 根據(jù)移位后的結(jié)果設(shè)置SF谤牡,ZF副硅,PF位
SAL 算術(shù)左移
和算術(shù)左移效果一樣
SHR 邏輯右移
格式:SHR OPR,1/CL
效果:將OPR向右移1位或CL位,如果要移CL位翅萤,先把移位次數(shù)置于CL中恐疲,左邊多余的位用0補(bǔ),溢出位放在CF中
- 根據(jù)移位后的結(jié)果設(shè)置SF断序,ZF流纹,PF位
SAR 算術(shù)右移
和算術(shù)右移效果一樣
ROL 循環(huán)左移
格式:ROL OPR,1/CL
效果:向左移1或CL位,溢出位補(bǔ)在右邊违诗,同時(shí)放在CF中
ROR 循環(huán)右移
格式:ROR OPR,1/CL
效果:向右移1或CL位漱凝,溢出位補(bǔ)在左邊,同時(shí)放在CF中
RCL 帶進(jìn)位循環(huán)左移
格式:RCL OPR,1/CL
效果:向左移1或CL位诸迟,溢出位放在CF中茸炒,同時(shí)原先的CF值補(bǔ)在右邊
RCR 帶進(jìn)位循環(huán)右移
格式:RCR OPR,1/CL
效果:向右移1或CL位,溢出位放在CF中阵苇,同時(shí)原先的CF值補(bǔ)在左邊
- 循環(huán)指令只能改變CF和OF壁公,移位指令根據(jù)結(jié)果改變SF,ZF绅项,PF
- OF當(dāng)移位數(shù)為1時(shí)有意義紊册,根據(jù)移位前后當(dāng)最高有效位發(fā)生變化時(shí)為1
-
這張圖解釋得很清楚
四、串處理指令
1. 可以與REP配合使用的指令
REP 重復(fù)串操作
格式:REP 串操作指令(MOVS,STOS,LODS,INS,OUTS)
效果:重復(fù)執(zhí)行串操作指令快耿,每執(zhí)行一次CX-1囊陡,直到CX=0為止
- 也就是說(shuō),CX要預(yù)先存指令的操作次數(shù)
MOVSB 串傳送
格式:
MOVS DST,SRC
MOVSB (字節(jié))
MOVSW (字)
效果:
MOVSB:將 DS:[SI] 傳一個(gè)字節(jié)到 ES:[DI] 中掀亥。如果DF=0撞反,則SI+1,DI+1搪花;如果DF=1遏片,則SI-1嘹害,DI-1
MOVSB:將 DS:[SI] 傳一個(gè)字到 ES:[DI] 中。如果DF=0吮便,則SI+2笔呀,DI+2;如果DF=1线衫,則SI-2凿可,DI-2
- 可以看出,DF是用來(lái)控制方向的授账,所以再介紹兩條指令
CLD:令DF=0
STD:令DF=1 - 可以與REP連用枯跑,用來(lái)復(fù)制DS中的字符串到ES中
STOS 傳入指令
格式:
STOS DST
STOSB (字節(jié))
STOSW (字)
效果:
STOSB:DS:[DI]←(AL),DF=0時(shí)白热,(DI)←(DI)+1,DF=1時(shí)敛助,(DI)←(DI)-1
STOSW:DS:[DI]←(AX),DF=0時(shí)屋确,(DI)←(DI)+2,DF=1時(shí)纳击,(DI)←(DI)-2
- 與REP連用,將連續(xù)的DS區(qū)域賦值攻臀,可以用來(lái)初始化
LODS 從串中取指令
格式:
LODS SRC
LODSB (字節(jié))
LODSW (字)
效果:
LODSB:(AL)←DS:[SI]焕数,如果DF=0,(SI)←(SI)+1刨啸;如果DF=1堡赔,(SI)←(SI)-1
LODSw:(AX)←DS:[SI],如果DF=0设联,(SI)←(SI)+2善已;如果DF=1,(SI)←(SI)-2
INS 串輸入指令
格式:
INS SRC
INSB (字節(jié))
INSW (字)
效果:把端口號(hào)在DX寄存器中的I/O空間的字節(jié)离例、字傳送到附加段中的目的變址寄存器所指向的存儲(chǔ)單元中换团。并根據(jù)DF修改變址寄存器的內(nèi)容
- 與REP連用,可以把成組的字節(jié)宫蛆、字從I/O端口輸入長(zhǎng)度為CX的緩沖區(qū)中
OUTS 串輸出指令
格式:
OUTS SRC
OUTSB (字節(jié))
OUTSW (字)
效果:把源變址寄存器中所指向的字節(jié)艘包、字傳送到端口號(hào)在DX的寄存器中的I/O端口中去。并根據(jù)DF修改變址寄存器的內(nèi)容
- 與REP連用耀盗,可以把成組的字節(jié)辑甜、字輸入長(zhǎng)度從存儲(chǔ)器中傳送到I/O空間
2. 與REPE/REPZ 和 REPNE/REPNZ聯(lián)合工作的CMPS和SCAS指令
REPE/REPZ 當(dāng)相等/為零時(shí)重復(fù)串操作
格式:REPE/REPZ String Primitive
效果:
CX=0或ZF=0(兩數(shù)不相等時(shí))退出,否則繼續(xù)執(zhí)行:CX-1袍冷,執(zhí)行其后的指令,重復(fù)以上操作
REPNE/REPNZ 當(dāng)不相等/不為零時(shí)重復(fù)串操作
格式:REPNE/RENPZ String Primitive
CMPS 串比較指令
用法:
CMPS SRC,DST
CMPSB (字節(jié))
CMPSW (字)
效果:
指令把源變址寄存器中指向數(shù)據(jù)段的字節(jié)猫牡、字與目的地址寄存器所指向的附加段中的一個(gè)字節(jié)胡诗、字相減,不保存結(jié)果,會(huì)記錄條件碼
SCAS 串掃描指令
格式:
SCAS DST
SCASB (字節(jié))
SCASW (字)
效果:
指令把AL煌恢、AX的內(nèi)容與目的變址寄存器在附加段中的一個(gè)字節(jié)骇陈、字進(jìn)行比較,并不保存結(jié)果瑰抵,會(huì)記錄條件碼
控制轉(zhuǎn)移指令
1. 無(wú)條件轉(zhuǎn)移指令
JMP 跳轉(zhuǎn)指令
段內(nèi)直接短轉(zhuǎn)移
格式:JMP SHORT OPR
效果:(IP)←(IP)+8位位移量
- IP是指針寄存器你雌,控制運(yùn)行的程序位置
- 位移量可以是符號(hào)地址
段內(nèi)直接近轉(zhuǎn)移
格式:JMP NEAR PRT OPR
效果:(IP)←(IP)+16位位移量
段內(nèi)間接近轉(zhuǎn)移
格式:JMP WORD PRT OPR
效果:(IP)←(EA)
段間直接遠(yuǎn)轉(zhuǎn)移
格式:JMP FAR PTR ORP
效果:
(IP)←OPR的段內(nèi)偏移地址
(CS)←OPR的段內(nèi)偏移地址
段間間接遠(yuǎn)轉(zhuǎn)移
格式:JMP DWORD PTR OPR
效果:
(IP)←(EA)
(CS)←(EA+2)
2. 條件轉(zhuǎn)移指令
- 所有的條件轉(zhuǎn)移指令不影響條件碼
根據(jù)單個(gè)條件標(biāo)志的設(shè)置情況轉(zhuǎn)移
JZ/JE 結(jié)果為零/不相等則轉(zhuǎn)移
格式:JZ/JE OPR
條件:ZF=1
JS 結(jié)果為負(fù)則轉(zhuǎn)移
格式:JS OPR
條件:SF=1
JNS 結(jié)果為正則轉(zhuǎn)移
格式:JNS OPR
條件:SF=0
JO 溢出則轉(zhuǎn)移
格式:JO OPR
條件:OF=1
JNO 不溢出則轉(zhuǎn)移
格式:JNO OPR
條件:OF=0
JP 奇偶位為1則轉(zhuǎn)移
格式:JP/JPE OPR
條件:PF=1
JNP 奇偶位為0則轉(zhuǎn)移
格式:JNP/JPO OPR
條件:PF=0
JB/JNAE/JC 低于/等于/進(jìn)位為1轉(zhuǎn)移
格式:JB/JNAE/JC OPR
條件:CF=1
JNB/JAE/JNC 高于/等于/進(jìn)位為0轉(zhuǎn)移
格式:JNB/JAE/JNC OPR
條件:CF=0
比較兩個(gè)帶符號(hào)數(shù),并根據(jù)比較結(jié)果轉(zhuǎn)移
JB 低于/進(jìn)位位為1則轉(zhuǎn)移
JNB 高于/進(jìn)位位為0則轉(zhuǎn)移
JBE/JNA 高于則轉(zhuǎn)移
格式:JBE/JNA OPR
條件:CF∨ZF=1
JNBE/JA 低于則轉(zhuǎn)移
格式:JNBE/JA OPR
條件:CF∨ZF=0
JL/JNGE 小于則轉(zhuǎn)移
格式:JL/JNGE OPR
條件:SF⊕OF=1
JNL/JGE 大于或等于則轉(zhuǎn)移
格式:JNL/JGE OPR
條件:SF⊕OF=0
JLE/JNG 小于或等于則轉(zhuǎn)移
格式:JLE/JNG OPR
條件:(SF⊕OF)∨ZF=1
JNLE/JG 大于則轉(zhuǎn)移
格式:JNLE/JG POR
條件:(SF⊕OF)∨ZF=0