組合語言 比較指令 跳轉指令 JCC

2021-09-19 22:46:47 字數 2031 閱讀 4632

一、jmp 指令:修改eip 當前執行的下一條指令

jmp暫存器/立即數

目標類似:mov  eip,暫存器/立即數

call指令:  呼叫函式  call 位址a/暫存器

等價: 

push位址b           ;儲存call的下一條指令位址,壓棧,作為返回值,

mov eip,位址a/暫存器            ; 將函式首位址作為eip

ret指令:

等價:leaesp,[esp+4]       ; esp = esp + 4

mov eip,[esp-4]     ;和 call相反,將call 指令的下一條指令位址賦值給eip;

二、比較指令

cmpr/m,r/m/imm

該指令是比較兩個運算元,實際上,它相當於sub指令,但是相減的結果並不儲存到第乙個運算元中。只是根據相減的結果來改變零標誌位的,當兩個運算元相等的時候,零標誌位置1。

test指令:指令格式:test  r/m,r/m/imm

該指令在一定程式上和cmp指令是類似的(類似and),兩個數值進行與操作,結果不儲存,但是會改變相應標誌位.

常見用法:用這個指令,可以確定某暫存器是否等於0。(觀察zf)

三、jcc指令  16種跳轉

比較指令之後,一般都會有分支判斷。

根據標誌位進行判斷,下一步的分支。

je, jz       

結果為零則跳轉(相等時跳轉)

zf=1

jne, jnz        

結果不為零則跳轉(不相等時跳轉)  

zf=0

js 結果為負則跳轉

sf=1

jns 

結果為非負則跳轉

sf=0

jp, jpe   

結果中1的個數為偶數則跳轉

pf=1

jnp, jpo   

結果中1的個數為偶數則跳轉

pf=0

jo    

結果溢位了則跳轉

of=1

jno    

結果沒有溢位則跳轉

of=0

jb, jnae   

小於則跳轉 (無符號數)

cf=1

jnb, jae    

大於等於則跳轉 (無符號數)

cf=0

jbe, jna    

小於等於則跳轉 (無符號數)

cf=1 or zf=1

jnbe, ja    

大於則跳轉(無符號數)

cf=0 and zf=0

jl, jnge    

小於則跳轉 (有符號數)

sf≠ of

jnl, jge    

大於等於則跳轉 (有符號數)

sf=of

jle, jng    

小於等於則跳轉 (有符號數)

zf=1 or sf≠ of

jnle, jg    

大於則跳轉(有符號數)

zf=0 and sf=of

四、思考

1、call執行時堆疊有什麼變化?eip有變化嗎?

call執行時,儲存了cal函式首位址到eip,同時將call函式的首位址壓棧; 

2、ret執行時堆疊有什麼變化?eip有變化嗎?

和call的過程相反,將前面call的下一條指令位址,從堆疊中取出來作為eip。

3、使用彙編指令修改標誌暫存器中的某個位的值,實現jcc的十六種跳轉.

不允許在od中通過雙擊的形式修改標誌暫存器.

要通過彙編指令的執行去影響標誌位,能用cmp和test實現的優先考慮.

見上面的**; 

組合語言條件跳轉指令彙總

x86 指令集包含大量的條件跳轉指令。它們能比較有符號和無符號整數,並根據單個 cpu 標誌位的值來執行操作。條件跳轉指令可以分為四個型別 基於特定標誌位的值跳轉 基於兩數是否相等,或是否等於 e cx 的值跳轉 基於無符號運算元的比較跳轉 基於有符號運算元的比較跳轉 下表展示了基於零標誌位 進製標...

組合語言條件跳轉指令詳解

指令 解釋jz 如果zf 1,跳轉至指定位置 jnz如果zf 0,跳轉至制定位置 je與jz類似,但通常在一條cmp指令後使用。如果源運算元與目的運算元相等,則跳轉 jne與jnz類似,但通常在一條cmp指令後使用。如果源運算元與目的運算元不相等,則跳轉 jgcmp指令做有符號比較之後,如果目的運算...

組合語言 彙編指令

功能 用來進行資料傳輸。以 mov a,b 為例,相當於a b。具有以下形式 mov 暫存器,資料 mov 暫存器,暫存器 mov 暫存器,記憶體單元 mov 記憶體單元,暫存器 mov 段暫存器,暫存器 功能 用來做加法。以 add a,b 為例,相當於a a b。具有的形式,和 mov 一樣。功...