日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言if和汇编jcc程序对比,汇编 JCC指令表与笔记

發(fā)布時(shí)間:2023/12/20 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言if和汇编jcc程序对比,汇编 JCC指令表与笔记 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

匯編-JCC

之前可以修改EIP寄存器的指令

JMP,CALL,RETN

所有JCC指令的動作->根據(jù)標(biāo)志寄存器修改EIP的值

標(biāo)志寄存器 EFLAGS

CF(bit 0)[Carry flag] C位

若算術(shù)產(chǎn)生的結(jié)果在最高有效位(most-significant bit)發(fā)生進(jìn)位或者借位則將其置1 反之清零

這個(gè)標(biāo)志通常用來指示無符號證書運(yùn)算的溢出狀態(tài)

寬度溢出位。只要容器內(nèi)放不下就會發(fā)生變化

MOV AL,0xFE

ADD AL,2 C => 1

MOV AL,0x7F

SBU AL,0xFF C => 1

PF (bit 2) [parity flag] P位 奇偶校驗(yàn)位

如果結(jié)果的最低有效字節(jié) 最后一個(gè)字節(jié)(least-significant byte)包含偶數(shù)個(gè)1位則該位置1,否則清零

利用PF可進(jìn)行奇偶校驗(yàn)檢查

需要傳輸1100 1110,數(shù)據(jù)中含5個(gè)1,所以其奇校驗(yàn)位位0,同時(shí)吧1100 1110傳輸給接收方,

接收方收到數(shù)據(jù)后再一次計(jì)算奇偶性,1100 1110中仍然含有5個(gè)1,所以接收方計(jì)算出的奇偶驗(yàn)位還是0,與發(fā)送方一致,表示在此次傳輸過程中未發(fā)生錯(cuò)誤。

例子:

MOV AL,0xCE

AF (bit 4)[Auxiliary Carry Flag] 輔助進(jìn)位標(biāo)志器

如果算術(shù)操作在結(jié)果的第三位發(fā)生進(jìn)位或者借位則該標(biāo)志置1,否則清零

這個(gè)標(biāo)志在BCD(binary-code decimal) 算術(shù)運(yùn)算中被使用

ZF(bit 5)[Zero Flag] 用的最多 劃重點(diǎn)。。

若結(jié)果為0則將其置1,反之清零。

經(jīng)常與CMP或者TEST等指令一起使用

例1: 判斷2個(gè)值是否相等

MOV EAX,100

MOV ECX,100

CMP EAX,ECX

(CMP指令相當(dāng)于SUB指令,但是相減的結(jié)果并不保存到第一個(gè)操作數(shù)中 只影響標(biāo)志寄存器)

例2:判斷某個(gè)值是否為0

AND EAX,EAX 0 ZF=1

TEST EAX,EAX

(TEST相當(dāng)于and,但是與運(yùn)算的結(jié)果并不保存到第一個(gè)操作數(shù)中 只影響標(biāo)志寄存器)

SF(bit 7) [Sign Flag]

該標(biāo)志被設(shè)置為有符號整型的最高有效位

(0指示結(jié)果為正,反之則為負(fù))

意思其實(shí)就是,運(yùn)算完之后看下符號位 是0(正)還是1(負(fù))

當(dāng)然如果是無符號數(shù)運(yùn)算就不用看了

只看容器內(nèi)數(shù)字的最高位

例子

MOV AL,0x7F MOV AL,0xFE

ADD AL,2 ADD AL,2

OF(bit 11)[OverFlow Flag]

溢出標(biāo)志OF用于反應(yīng)有符號數(shù)加減運(yùn)算所得結(jié)果是否溢出

可以這樣理解:

* 如果是無符號數(shù)運(yùn)算,是否溢出看CF位

* 如果是有符號數(shù)運(yùn)算,是否溢出看OF位

兩個(gè)數(shù)做運(yùn)算,運(yùn)算完畢的結(jié)果跟運(yùn)算前的數(shù)的最高位相同 OF為0

最高位不同 為1

例子:

MOV AL,0x7F

ADD AL,2

DF(bit 10)[Diretion Flag]

這個(gè)方向標(biāo)志控制字符串指令(`MOVS`,CMPS,SCAS,LODS以及`STOS`)。設(shè)置DF標(biāo)志是的串指令自動遞減(從高地址向低地址方向處理字符串),清楚該標(biāo)志則是的串指令自動遞增

STD以及CLD指令分別用戶設(shè)置以及清除DF標(biāo)志

JCC常見指令

有符號和無符號的區(qū)別:

CMP AL,CL

JG 0x12345678

JA 0x12345678

匯編 JCC指令表

JCC指條件跳轉(zhuǎn)指令,CC就是指條件碼。

JCC指令

中文含義

英文原意

檢查符號位

典型C應(yīng)用

JZ/JE

若為0則跳轉(zhuǎn);若相等則跳轉(zhuǎn)

jump if zero;jump if equal

ZF=1

if (i == j);if (i == 0);

JNZ/JNE

若不為0則跳轉(zhuǎn);若不相等則跳轉(zhuǎn)

jump if not zero;jump if not equal

ZF=0

if (i != j);if (i != 0);

JS

若為負(fù)則跳轉(zhuǎn)

jump if sign

SF=1

if (i < 0);

JNS

若為正則跳轉(zhuǎn)

jump if not sign

SF=0

if (i > 0);

JP/JPE

若1出現(xiàn)次數(shù)為偶數(shù)則跳轉(zhuǎn)

jump if Parity (Even)

PF=1

(null)

JNP/JPO

若1出現(xiàn)次數(shù)為奇數(shù)則跳轉(zhuǎn)

jump if not parity (odd)

PF=0

(null)

JO

若溢出則跳轉(zhuǎn)

jump if overflow

OF=1

(null)

JNO

若無溢出則跳轉(zhuǎn)

jump if not overflow

OF=0

(null)

JC/JB/JNAE

若進(jìn)位則跳轉(zhuǎn);若低于則跳轉(zhuǎn);若不高于等于則跳轉(zhuǎn)

jump if carry;jump if below;jump if not above equal

CF=1

if (i < j);

JNC/JNB/JAE

若無進(jìn)位則跳轉(zhuǎn);若不低于則跳轉(zhuǎn);若高于等于則跳轉(zhuǎn);

jump if not carry;jump if not below;jump if above equal

CF=0

if (i >= j);

JBE/JNA

若低于等于則跳轉(zhuǎn);若不高于則跳轉(zhuǎn)

jump if below equal;jump if not above

ZF=1或CF=1

if (i <= j);

JNBE/JA

若不低于等于則跳轉(zhuǎn);若高于則跳轉(zhuǎn)

jump if not below equal;jump if above

ZF=0或CF=0

if (i > j);

JL/JNGE

若小于則跳轉(zhuǎn);若不大于等于則跳轉(zhuǎn)

jump if less;jump if not greater equal

SF != OF

if (si < sj);

JNL/JGE

若不小于則跳轉(zhuǎn);若大于等于則跳轉(zhuǎn);

jump if not less;jump if greater equal

SF = OF

if (si >= sj);

JLE/JNG

若小于等于則跳轉(zhuǎn);若不大于則跳轉(zhuǎn)

jump if less equal;jump if not greater

ZF != OF 或 ZF=1

if (si <= sj);

JNLE/JG

若不小于等于則跳轉(zhuǎn);若大于則跳轉(zhuǎn)

jump if not less equal;jump if greater

SF=0F 且 ZF=0

if(si>sj)

匯編JCC筆記

1. JMP指令:

唯一作用是無條件修改EIP的值,沒有對棧和寄存器產(chǎn)生影響。

JMP 寄存器/立即數(shù)

本質(zhì)是MOV EIP,寄存器/立即數(shù),EIP只能由JMP指令修改

2. CALL指令:

第一個(gè)作用和JMP一樣,MOV EIP,寄存器/立即數(shù)。

第二個(gè)作用,把CALL指令的寫一個(gè)指令地址push到棧頂(修改ESP)

CALL指令還沒執(zhí)行,怎么知道下一行指令的地址?

根據(jù)CALL指令占用的數(shù)據(jù)寬度,加偏移量去算,比如CALL這條指令,地址0X004183D7中數(shù)據(jù)為E8 21 00 00 00,有5個(gè)字節(jié),下一行指令的地址就是地址偏移5

3.RET

本質(zhì)是POP EIP

RET指令通常和CALL成對出現(xiàn),把CALL壓棧的地址POP EIP,讓程序回歸原來的流程

4. CMP指令:該指令是比較兩個(gè)操作數(shù)是否相同

指令格式:CMP R/M,R/M/IMM

相當(dāng)于SUB指令,但是只會用兩個(gè)數(shù)相減來比較是否相同,相減的結(jié)果并不保存在第一個(gè)操作數(shù)中。

只會根據(jù)相減的結(jié)果來改變標(biāo)志位的,當(dāng)兩個(gè)操作數(shù)相等的時(shí)候,零標(biāo)志位置為1.

MOV EAX,100

MOV ECX,100

CMP EAX,ECX? //只相減比較,判斷并修改零標(biāo)志寄存器,不會把EAX修改為相減結(jié)果。

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有一定的相似性,兩個(gè)數(shù)值進(jìn)行與操作,結(jié)果也不保存,但是會改變相應(yīng)標(biāo)志位。

與操作:1 and 1 =1;1 and 0 = 0; 0 and 1 = 0; 0 and 0 = 0

常見用法:用這個(gè)指令,可以確定某寄存器是否等于0,如果EAX的二進(jìn)制某些位為 1 的話,那么運(yùn)算的結(jié)果就不為零。

TEST EAX,EAX

5.

1. JE,JZ -------jump if equal結(jié)果為零則跳轉(zhuǎn)(相等時(shí)跳轉(zhuǎn))-------ZF = 1

例:

CMP EAX,ECX

JZ 0x413f9

1、 ?JE, JZ? ? ? ? ?-------------結(jié)果為零則跳轉(zhuǎn)(相等時(shí)跳轉(zhuǎn))----------------ZF=1

2、 ?JNE, JNZ? ?-------------結(jié)果不為零則跳轉(zhuǎn)(不相等時(shí)跳轉(zhuǎn))----------------ZF=0

3、 ?JS? ? ? ? ? ? ? -------------結(jié)果為負(fù)則跳轉(zhuǎn)----------------SF=1

4、 ?JNS? ? ? ? ? ?-------------結(jié)果為非負(fù)則跳轉(zhuǎn)----------------SF=0

5、 ?JP, JPE? ? ?-------------結(jié)果中1的個(gè)數(shù)為偶數(shù)則跳轉(zhuǎn)----------------PF=1

6、 ?JNP, JPO? -------------結(jié)果中1的個(gè)數(shù)為偶數(shù)則跳轉(zhuǎn)----------------PF=0

7、 ?JO? ? ? ? ? ? -------------結(jié)果溢出了則跳轉(zhuǎn)----------------OF=1

8、 ?JNO? ? ? ? ?-------------結(jié)果沒有溢出則跳轉(zhuǎn)----------------OF=0

9、 ? JB, JNAE-------------小于則跳轉(zhuǎn) (無符號數(shù))----------------CF=1

10、 JNB, JAE-------------大于等于則跳轉(zhuǎn) (無符號數(shù))----------------CF=0

11、 ?JBE, JNA-------------小于等于則跳轉(zhuǎn) (無符號數(shù))----------------CF=1 or ZF=1

12、 JNBE, JA-------------大于則跳轉(zhuǎn)(無符號數(shù))----------------CF=0 and ZF=0

13、 JL, JNGE-------------小于則跳轉(zhuǎn) (有符號數(shù))----------------SF≠ OF

14、 JNL, JGE-------------大于等于則跳轉(zhuǎn) (有符號數(shù))----------------SF=OF

15、 JLE, JNG-------------小于等于則跳轉(zhuǎn) (有符號數(shù))----------------ZF=1 or SF≠ OF

16、 JNLE, JG-------------大于則跳轉(zhuǎn)(有符號數(shù))----------------ZF=0 and SF=OF

好了這篇關(guān)于匯編 JCC指令表與筆記的文章就介紹到這了,希望大家以后多多支持腳本之家。

總結(jié)

以上是生活随笔為你收集整理的C语言if和汇编jcc程序对比,汇编 JCC指令表与笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。