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