C语言if和汇编jcc程序对比,汇编 JCC指令表与笔记
匯編-JCC
之前可以修改EIP寄存器的指令
JMP,CALL,RETN
所有JCC指令的動作->根據(jù)標志寄存器修改EIP的值
標志寄存器 EFLAGS
CF(bit 0)[Carry flag] C位
若算術產(chǎn)生的結果在最高有效位(most-significant bit)發(fā)生進位或者借位則將其置1 反之清零
這個標志通常用來指示無符號證書運算的溢出狀態(tài)
寬度溢出位。只要容器內放不下就會發(fā)生變化
MOV AL,0xFE
ADD AL,2 C => 1
MOV AL,0x7F
SBU AL,0xFF C => 1
PF (bit 2) [parity flag] P位 奇偶校驗位
如果結果的最低有效字節(jié) 最后一個字節(jié)(least-significant byte)包含偶數(shù)個1位則該位置1,否則清零
利用PF可進行奇偶校驗檢查
需要傳輸1100 1110,數(shù)據(jù)中含5個1,所以其奇校驗位位0,同時吧1100 1110傳輸給接收方,
接收方收到數(shù)據(jù)后再一次計算奇偶性,1100 1110中仍然含有5個1,所以接收方計算出的奇偶驗位還是0,與發(fā)送方一致,表示在此次傳輸過程中未發(fā)生錯誤。
例子:
MOV AL,0xCE
AF (bit 4)[Auxiliary Carry Flag] 輔助進位標志器
如果算術操作在結果的第三位發(fā)生進位或者借位則該標志置1,否則清零
這個標志在BCD(binary-code decimal) 算術運算中被使用
ZF(bit 5)[Zero Flag] 用的最多 劃重點。。
若結果為0則將其置1,反之清零。
經(jīng)常與CMP或者TEST等指令一起使用
例1: 判斷2個值是否相等
MOV EAX,100
MOV ECX,100
CMP EAX,ECX
(CMP指令相當于SUB指令,但是相減的結果并不保存到第一個操作數(shù)中 只影響標志寄存器)
例2:判斷某個值是否為0
AND EAX,EAX 0 ZF=1
TEST EAX,EAX
(TEST相當于and,但是與運算的結果并不保存到第一個操作數(shù)中 只影響標志寄存器)
SF(bit 7) [Sign Flag]
該標志被設置為有符號整型的最高有效位
(0指示結果為正,反之則為負)
意思其實就是,運算完之后看下符號位 是0(正)還是1(負)
當然如果是無符號數(shù)運算就不用看了
只看容器內數(shù)字的最高位
例子
MOV AL,0x7F MOV AL,0xFE
ADD AL,2 ADD AL,2
OF(bit 11)[OverFlow Flag]
溢出標志OF用于反應有符號數(shù)加減運算所得結果是否溢出
可以這樣理解:
* 如果是無符號數(shù)運算,是否溢出看CF位
* 如果是有符號數(shù)運算,是否溢出看OF位
兩個數(shù)做運算,運算完畢的結果跟運算前的數(shù)的最高位相同 OF為0
最高位不同 為1
例子:
MOV AL,0x7F
ADD AL,2
DF(bit 10)[Diretion Flag]
這個方向標志控制字符串指令(`MOVS`,CMPS,SCAS,LODS以及`STOS`)。設置DF標志是的串指令自動遞減(從高地址向低地址方向處理字符串),清楚該標志則是的串指令自動遞增
STD以及CLD指令分別用戶設置以及清除DF標志
JCC常見指令
有符號和無符號的區(qū)別:
CMP AL,CL
JG 0x12345678
JA 0x12345678
匯編 JCC指令表
JCC指條件跳轉指令,CC就是指條件碼。
JCC指令
中文含義
英文原意
檢查符號位
典型C應用
JZ/JE
若為0則跳轉;若相等則跳轉
jump if zero;jump if equal
ZF=1
if (i == j);if (i == 0);
JNZ/JNE
若不為0則跳轉;若不相等則跳轉
jump if not zero;jump if not equal
ZF=0
if (i != j);if (i != 0);
JS
若為負則跳轉
jump if sign
SF=1
if (i < 0);
JNS
若為正則跳轉
jump if not sign
SF=0
if (i > 0);
JP/JPE
若1出現(xiàn)次數(shù)為偶數(shù)則跳轉
jump if Parity (Even)
PF=1
(null)
JNP/JPO
若1出現(xiàn)次數(shù)為奇數(shù)則跳轉
jump if not parity (odd)
PF=0
(null)
JO
若溢出則跳轉
jump if overflow
OF=1
(null)
JNO
若無溢出則跳轉
jump if not overflow
OF=0
(null)
JC/JB/JNAE
若進位則跳轉;若低于則跳轉;若不高于等于則跳轉
jump if carry;jump if below;jump if not above equal
CF=1
if (i < j);
JNC/JNB/JAE
若無進位則跳轉;若不低于則跳轉;若高于等于則跳轉;
jump if not carry;jump if not below;jump if above equal
CF=0
if (i >= j);
JBE/JNA
若低于等于則跳轉;若不高于則跳轉
jump if below equal;jump if not above
ZF=1或CF=1
if (i <= j);
JNBE/JA
若不低于等于則跳轉;若高于則跳轉
jump if not below equal;jump if above
ZF=0或CF=0
if (i > j);
JL/JNGE
若小于則跳轉;若不大于等于則跳轉
jump if less;jump if not greater equal
SF != OF
if (si < sj);
JNL/JGE
若不小于則跳轉;若大于等于則跳轉;
jump if not less;jump if greater equal
SF = OF
if (si >= sj);
JLE/JNG
若小于等于則跳轉;若不大于則跳轉
jump if less equal;jump if not greater
ZF != OF 或 ZF=1
if (si <= sj);
JNLE/JG
若不小于等于則跳轉;若大于則跳轉
jump if not less equal;jump if greater
SF=0F 且 ZF=0
if(si>sj)
匯編JCC筆記
1. JMP指令:
唯一作用是無條件修改EIP的值,沒有對棧和寄存器產(chǎn)生影響。
JMP 寄存器/立即數(shù)
本質是MOV EIP,寄存器/立即數(shù),EIP只能由JMP指令修改
2. CALL指令:
第一個作用和JMP一樣,MOV EIP,寄存器/立即數(shù)。
第二個作用,把CALL指令的寫一個指令地址push到棧頂(修改ESP)
CALL指令還沒執(zhí)行,怎么知道下一行指令的地址?
根據(jù)CALL指令占用的數(shù)據(jù)寬度,加偏移量去算,比如CALL這條指令,地址0X004183D7中數(shù)據(jù)為E8 21 00 00 00,有5個字節(jié),下一行指令的地址就是地址偏移5
3.RET
本質是POP EIP
RET指令通常和CALL成對出現(xiàn),把CALL壓棧的地址POP EIP,讓程序回歸原來的流程
4. CMP指令:該指令是比較兩個操作數(shù)是否相同
指令格式:CMP R/M,R/M/IMM
相當于SUB指令,但是只會用兩個數(shù)相減來比較是否相同,相減的結果并不保存在第一個操作數(shù)中。
只會根據(jù)相減的結果來改變標志位的,當兩個操作數(shù)相等的時候,零標志位置為1.
MOV EAX,100
MOV ECX,100
CMP EAX,ECX? //只相減比較,判斷并修改零標志寄存器,不會把EAX修改為相減結果。
CMP AX,WORD PTR DS:[405000]
CMP AL,BYTE PTR DS:[405000]
CMP EAX,DWORD PTR DS:[405000]
4. TEST指令:
指令格式:TEST R/M,R/M/IMM
該指令和CMP有一定的相似性,兩個數(shù)值進行與操作,結果也不保存,但是會改變相應標志位。
與操作:1 and 1 =1;1 and 0 = 0; 0 and 1 = 0; 0 and 0 = 0
常見用法:用這個指令,可以確定某寄存器是否等于0,如果EAX的二進制某些位為 1 的話,那么運算的結果就不為零。
TEST EAX,EAX
5.
1. JE,JZ -------jump if equal結果為零則跳轉(相等時跳轉)-------ZF = 1
例:
CMP EAX,ECX
JZ 0x413f9
1、 ?JE, JZ? ? ? ? ?-------------結果為零則跳轉(相等時跳轉)----------------ZF=1
2、 ?JNE, JNZ? ?-------------結果不為零則跳轉(不相等時跳轉)----------------ZF=0
3、 ?JS? ? ? ? ? ? ? -------------結果為負則跳轉----------------SF=1
4、 ?JNS? ? ? ? ? ?-------------結果為非負則跳轉----------------SF=0
5、 ?JP, JPE? ? ?-------------結果中1的個數(shù)為偶數(shù)則跳轉----------------PF=1
6、 ?JNP, JPO? -------------結果中1的個數(shù)為偶數(shù)則跳轉----------------PF=0
7、 ?JO? ? ? ? ? ? -------------結果溢出了則跳轉----------------OF=1
8、 ?JNO? ? ? ? ?-------------結果沒有溢出則跳轉----------------OF=0
9、 ? JB, JNAE-------------小于則跳轉 (無符號數(shù))----------------CF=1
10、 JNB, JAE-------------大于等于則跳轉 (無符號數(shù))----------------CF=0
11、 ?JBE, JNA-------------小于等于則跳轉 (無符號數(shù))----------------CF=1 or ZF=1
12、 JNBE, JA-------------大于則跳轉(無符號數(shù))----------------CF=0 and ZF=0
13、 JL, JNGE-------------小于則跳轉 (有符號數(shù))----------------SF≠ OF
14、 JNL, JGE-------------大于等于則跳轉 (有符號數(shù))----------------SF=OF
15、 JLE, JNG-------------小于等于則跳轉 (有符號數(shù))----------------ZF=1 or SF≠ OF
16、 JNLE, JG-------------大于則跳轉(有符號數(shù))----------------ZF=0 and SF=OF
好了這篇關于匯編 JCC指令表與筆記的文章就介紹到這了,希望大家以后多多支持腳本之家。
總結
以上是生活随笔為你收集整理的C语言if和汇编jcc程序对比,汇编 JCC指令表与笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1275 - 【入门】输出杨辉三角的前N
- 下一篇: 金蝶系统登不上服务器270,电脑进不了金