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指令提供了控制...