學習 跳轉指令

2022-03-14 00:07:35 字數 3294 閱讀 4035

jz/je指令:根據z標誌位進行跳轉

jz和je相同(shark恆老師說的,我就記錄下,但是他也說過不是完全相同)

1、直接定位到乙個存在je跳轉的位址,然後發現是存在跳轉的,如圖

上圖的z標誌位為1,所以會進行跳轉,但是如果修改z標誌位為0則不會,如圖

同時je和jz也相同

jnz/jne指令:根據z標誌位進行跳轉

同樣是根據z標誌位進行跳轉,但是是相反的,當z標誌位為0的時候進行跳轉,當z標誌位為1的時候不跳轉

1、修改當前位址的彙編指令為cmp eax,ecx,然後下個位址再修改為jnz 0040101d

2、修改eax的暫存器的值為00000001,ecx的暫存器的值為00000000

3、單步步過

cmp計算的結果不為0,所以z標誌位同樣不為1,所以jnz/jez會進行跳轉,因為跟je/jz是相反判斷的

jmp指令:無條件跳轉,不會受標誌位的影響

下面兩張圖能夠發現,無論z標誌位是否為1 都會進行跳轉

js和jns指令:根據s標誌位進行判斷是否跳轉

js和jns都是根據s標誌位進行判斷的,只是是否跳轉是判斷相反s標誌位

1、修改當前位址的彙編指令為cmp eax,ecx,然後下個位址再修改為js 0040101d

2、修改eax的暫存器的值為00000001,ecx的暫存器的值為00000000

3、單步步過

發現s標誌位為0,不會進行跳轉,原因十六進製制00000001減去十六進製制00000000,結果是個正數所以s標誌位為0,而js是當s標誌位為0的時候不跳轉,當s標誌位為1的時候進行跳轉

jns就是反一下,當s標誌位為0的時候跳轉,為1的時候不跳轉

jp和jpz指令:根據p標誌位進行判斷是否跳轉

jp和jnp都是根據s標誌位進行判斷的,只是是否跳轉是判斷相反p標誌位

這裡需要記錄下jp和jpe是相同的,jnp和jpo是相同的

1、修改當前位址的彙編指令為cmp eax,ecx,然後下個位址再修改為jp 0040101d

2、修改eax的暫存器的值為00000001,ecx的暫存器的值為00000000

3、單步步過

發現不會進行跳轉,原因是p標誌位是奇偶標誌位,根據二進位制數中的1的個數進行判斷的,cmp eax ecx結果是00000001,轉換為二進位制那麼就是0001,1的個數為奇數那麼p標誌位就為0,那麼也就不跳轉了

jnp就是反一下,當p標誌位為0的時候跳轉,為1的時候不跳轉

jo和jno指令:根據o標誌位進行判斷

1、修改當前位址的彙編指令為add eax,ecx,然後下個位址再修改為jo 0040101d

2、修改eax的暫存器的值為7ffffff,ecx的暫存器的值為00000001

3、單步步過

o標誌位當溢位的時候7fffffff + 0x1 為 80000000 變成有符號位的最小整數,自然o標誌位為1,jo指令當o標誌位為1的時候則進行跳轉

jno則相反,當o標誌位為0的時候則不進行跳轉

jb和jnb指令:當cmp指令第乙個運算元小於第二個運算元的時候則進行跳轉

1、修改當前位址的彙編指令為cmp eax,ecx,然後下個位址再修改為jb 0040101d

2、修改eax的暫存器的值為00000000,ecx的暫存器的值為00000001

3、單步步過

原因是eax小於ecx,c標誌位為1,所以進行跳轉

當c標誌位改為0的時候,則不進行跳轉

jnb則相反,當c標誌位為0的時候,進行跳轉,否則不跳轉

jbe和jnbe指令:當cmp指令第乙個運算元小於等於第二個運算元的時候則進行跳轉,並且受標誌位c和z的影響

發現c標誌位為0 但是z標誌位為1 ,則進行跳轉

jnbe則相反,jnbe跟ja相同

把c標誌位置為0,z標誌位置為0,發現能夠進行跳轉

jl指令:根據s標誌位進行判斷是否跳轉,並且計算的是有符號位之間的運算

1、修改當前位址的彙編指令為cmp eax,ecx,然後下個位址再修改為jl 0040101d

2、修改eax的暫存器的值為00000000,ecx的暫存器的值為00000001

3、單步步過

發現s標誌位為1,因為cmp指令 結果為十進位制0-1 為 -1,是乙個負數 所以s標誌位為1

可以再把eax修改為fffffff6,那麼十進位制就為-10,然後重新定位eip,再進行單步步過

可以發現s標誌位沒變化,還是為1,那麼也可以證實了計算的是有符號位之間的運算

jl和jb指令之間的區別:

彙編 跳轉指令

助記符 標誌位說明 jz je zf 1 等於零 相等 jnz jne zf 0 不等於零 不相等 jssf 1 符號為負 jnssf 0 符號為正 jp jpe pf 1 低8位 1 的個數為偶 jnp npo pf 0 低8位 1 的個數為奇 joof 1 溢位jno of 0 無溢位jc jb...

跳轉指令 jmp call ret retf

jmp call和ret指令的近轉移形式只是在當前 段中執行程式控制轉移,因此不會執行特權級檢查。jmp call或ret指令的遠轉移形式會把控制轉移到另外乙個 段中,因此處理器一定會執行特權級檢查。1 jmp指令 不影響堆疊 緊緊進行執行流程的跳轉,不會儲存返回位址。書p55 對於jmp而言,長短...

條件跳轉指令 383

7.5 條件跳轉指令 383 2006 6 29 15 00 00 7.2 低階控制結構 378 7.3 語句標號 378 7.4 無條件控制轉移 jmp 380 7.6 中級 控制結構 jt和jf 386 7.7 使用組合語言實現通用控制結構 386 7.8 選擇 386 雖然jmp指令提供了控制...