匯編語(yǔ)言:比較指令、跳轉(zhuǎn)指令、JCC的使用
一、JMP 指令:修改EIP 當(dāng)前運(yùn)行的下一條指令
JMP 寄存器/立即數(shù)
目標(biāo)類似: mov EIP,寄存器/立即數(shù)
CALL指令: 調(diào)用函數(shù) CALL 地址A/寄存器
等價(jià):
PUSH 地址B ;保存call的下一條指令地址,壓棧,作為返回值,
MOV EIP,地址A/寄存器 ; 將函數(shù)首地址作為EIP
RET指令:
等價(jià):LEA ESP,[ESP+4] ; esp = esp + 4
MOV EIP,[ESP-4] ;和 CALL相反,將CALL 指令的下一條指令地址賦值給EIP;
二、比較指令
CMP R/M,R/M/IMM
該指令是比較兩個(gè)操作數(shù),實(shí)際上,它相當(dāng)于SUB指令,但是相減的結(jié)果并不保存到第一個(gè)操作數(shù)中。只是根據(jù)相減的結(jié)果來(lái)改變零標(biāo)志位的,當(dāng)兩個(gè)操作數(shù)相等的時(shí)候,零標(biāo)志位置1。
TEST指令:指令格式:TEST R/M,R/M/IMM
該指令在一定程序上和CMP指令是類似的(類似and),兩個(gè)數(shù)值進(jìn)行與操作,結(jié)果不保存,但是會(huì)改變相應(yīng)標(biāo)志位.
常見(jiàn)用法:用這個(gè)指令,可以確定某寄存器是否等于0。(觀察ZF)
三、JCC指令 16種跳轉(zhuǎn)
比較指令之后,一般都會(huì)有分支判斷。
根據(jù)標(biāo)志位進(jìn)行判斷,下一步的分支。
JE, JZ | 結(jié)果為零則跳轉(zhuǎn)(相等時(shí)跳轉(zhuǎn)) | ZF=1 |
JNE, JNZ | 結(jié)果不為零則跳轉(zhuǎn)(不相等時(shí)跳轉(zhuǎn)) | ZF=0 |
JS | 結(jié)果為負(fù)則跳轉(zhuǎn) | SF=1 |
JNS | 結(jié)果為非負(fù)則跳轉(zhuǎn) | SF=0 |
JP, JPE | 結(jié)果中1的個(gè)數(shù)為偶數(shù)則跳轉(zhuǎn) | PF=1 |
JNP, JPO | 結(jié)果中1的個(gè)數(shù)為偶數(shù)則跳轉(zhuǎn) | PF=0 |
JO | 結(jié)果溢出了則跳轉(zhuǎn) | OF=1 |
JNO | 結(jié)果沒(méi)有溢出則跳轉(zhuǎn) | OF=0 |
JB, JNAE | 小于則跳轉(zhuǎn) (無(wú)符號(hào)數(shù)) | CF=1 |
JNB, JAE | 大于等于則跳轉(zhuǎn) (無(wú)符號(hào)數(shù)) | CF=0 |
JBE, JNA | 小于等于則跳轉(zhuǎn) (無(wú)符號(hào)數(shù)) | CF=1 or ZF=1 |
JNBE, JA | 大于則跳轉(zhuǎn)(無(wú)符號(hào)數(shù)) | CF=0 and ZF=0 |
JL, JNGE | 小于則跳轉(zhuǎn) (有符號(hào)數(shù)) | SF≠ OF |
JNL, JGE | 大于等于則跳轉(zhuǎn) (有符號(hào)數(shù)) | SF=OF |
JLE, JNG | 小于等于則跳轉(zhuǎn) (有符號(hào)數(shù)) | ZF=1 or SF≠ OF |
JNLE, JG | 大于則跳轉(zhuǎn)(有符號(hào)數(shù)) | ZF=0 and SF=OF |
四、思考
1、CALL執(zhí)行時(shí)堆棧有什么變化?EIP有變化嗎?
Call執(zhí)行時(shí),保存了cal函數(shù)首地址到EIP,同時(shí)將Call函數(shù)的首地址壓棧;
2、RET執(zhí)行時(shí)堆棧有什么變化?EIP有變化嗎?
和Call的過(guò)程相反,將前面Call的下一條指令地址,從堆棧中取出來(lái)作為EIP。
3、使用匯編指令修改標(biāo)志寄存器中的某個(gè)位的值,實(shí)現(xiàn)JCC的十六種跳轉(zhuǎn).
不允許在OD中通過(guò)雙擊的形式修改標(biāo)志寄存器.
要通過(guò)匯編指令的執(zhí)行去影響標(biāo)志位,能用CMP和TEST實(shí)現(xiàn)的優(yōu)先考慮.
見(jiàn)上面的表格;
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
通過(guò)匯編看golang函數(shù)的多返回值問(wèn)題
這篇文章主要介紹了通過(guò)匯編看golang函數(shù)的多返回值問(wèn)題,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06計(jì)算機(jī)系統(tǒng)匯編語(yǔ)言和機(jī)器語(yǔ)言深入理解
這篇文章主要為大家介紹了計(jì)算機(jī)系統(tǒng)匯編語(yǔ)言和機(jī)器語(yǔ)言深入理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09匯編語(yǔ)言?masm5與debug命令使用方法小結(jié)
本文總結(jié)了匯編程序的基本框架及規(guī)范、masm5工具的基本使用方法、debug命令的基本使用方法2023-08-08匯編語(yǔ)言AND指令實(shí)現(xiàn)對(duì)兩個(gè)操作數(shù)進(jìn)行邏輯(按位)與操作
這篇文章主要介紹了匯編語(yǔ)言AND指令實(shí)現(xiàn)對(duì)兩個(gè)操作數(shù)進(jìn)行邏輯(按位)與操作,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01詳解匯編語(yǔ)言中中括號(hào)[]作用及l(fā)ea和mov指令的區(qū)別
這篇文章主要介紹了匯編語(yǔ)言中中括號(hào)[]作用及l(fā)ea和mov指令的區(qū)別,本文分步驟給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01匯編語(yǔ)言學(xué)習(xí)assume的作用詳解
這篇文章主要為大家介紹了匯編語(yǔ)言學(xué)習(xí)assume的作用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2021-11-11