匯編語言:比較指令、跳轉(zhuǎn)指令、JCC的使用
一、JMP 指令:修改EIP 當前運行的下一條指令
JMP 寄存器/立即數(shù)
目標類似: 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ù),實際上,它相當于SUB指令,但是相減的結(jié)果并不保存到第一個操作數(shù)中。只是根據(jù)相減的結(jié)果來改變零標志位的,當兩個操作數(shù)相等的時候,零標志位置1。
TEST指令:指令格式:TEST R/M,R/M/IMM
該指令在一定程序上和CMP指令是類似的(類似and),兩個數(shù)值進行與操作,結(jié)果不保存,但是會改變相應(yīng)標志位.
常見用法:用這個指令,可以確定某寄存器是否等于0。(觀察ZF)
三、JCC指令 16種跳轉(zhuǎn)
比較指令之后,一般都會有分支判斷。
根據(jù)標志位進行判斷,下一步的分支。
| JE, JZ | 結(jié)果為零則跳轉(zhuǎn)(相等時跳轉(zhuǎn)) | ZF=1 |
| JNE, JNZ | 結(jié)果不為零則跳轉(zhuǎn)(不相等時跳轉(zhuǎn)) | ZF=0 |
| JS | 結(jié)果為負則跳轉(zhuǎn) | SF=1 |
| JNS | 結(jié)果為非負則跳轉(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、使用匯編指令修改標志寄存器中的某個位的值,實現(xiàn)JCC的十六種跳轉(zhuǎn).
不允許在OD中通過雙擊的形式修改標志寄存器.
要通過匯編指令的執(zhí)行去影響標志位,能用CMP和TEST實現(xiàn)的優(yōu)先考慮.
見上面的表格;
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
匯編用串檢測scasb尋找數(shù)的位置實現(xiàn)
這篇文章主要介紹了匯編用串檢測scasb尋找數(shù)的位置實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-02-02

