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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

编程问答

反汇编基础-加法的求值过程(各种类型)

發(fā)布時(shí)間:2025/3/15 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 反汇编基础-加法的求值过程(各种类型) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

首先看int型

代碼如下:

int nOne = 0, nTwo = 0;nOne = 1 + 1;nOne = nOne + 1;nTwo = nOne + nTwo;

這里先來(lái)一次人肉反匯編:

mov [nOne],0 mov [nTow],0mov eax,1 add eax,1 mov [nOne],eaxmov eax,[nOne] add eax,1 mov [nOne],eaxmov eax,[nOne] add eax,[nTwo] mov [nTwo],eax

這里來(lái)看下實(shí)際的反匯編代碼:


這里面可以知道向nOne=1+1的這種,編譯器是直接計(jì)算為2(估計(jì)是優(yōu)化過(guò)的了),然后再進(jìn)行賦值的。


下面來(lái)看short型的反匯編:

//2字節(jié)的長(zhǎng)度,無(wú)法直接使用32位寄存器,只能使用他的低(高)位short sOne = 0, sTwo = 0;sOne = 1 + 1;sTwo = sTwo + sOne;

這里先使用下人肉反匯編:

mov [sOne],0 mov [sTwo],0 //這兩個(gè)是錯(cuò)誤的,其實(shí)short型被翻譯為4個(gè)匯編語(yǔ)句 //這里并不為他賦0,也是因?yàn)樗?字節(jié),需要使用寄存器中的高位或低位進(jìn)行數(shù)據(jù)操作并且xor比mov指令執(zhí)行的周期更短。 //所以人肉下他的反匯編xor eax,eax mov [sOne],ax mov [sTwo],axmov eax,2 mov [sOne],axmovsx eax,[sOne] // 符號(hào)擴(kuò)展的意思是,當(dāng)計(jì)算機(jī)存儲(chǔ)某一個(gè)有符號(hào)數(shù)時(shí),符號(hào)位位于該數(shù)的第一位,所以 //當(dāng)擴(kuò)展一個(gè)負(fù)數(shù)的時(shí)候需要將擴(kuò)展的高位全賦為1.對(duì)于正數(shù)而言,符號(hào)擴(kuò)展和零擴(kuò)展MOVZX是一樣的,將擴(kuò)展的高位全賦為0. movsx ebx,[sTwo] add eax,ebx mov [sTwo],ax


這里來(lái)看下他的實(shí)際反匯編:


根據(jù)上面真實(shí)的反匯編代碼可知:

1.現(xiàn)在的操作系統(tǒng)對(duì)處理short數(shù)據(jù)時(shí),都把他搞成32位(movsx指令),再進(jìn)行操作。

2.原因可以猜測(cè)到的,現(xiàn)在的電腦,整數(shù)都默認(rèn)為int,而浮點(diǎn)數(shù)都默認(rèn)為double,所以,float估計(jì)也和這個(gè)差不多。


下面來(lái)看long long類(lèi)型

代碼如下:

//64字節(jié)long long llOne = 0, llTwo = 0;llOne = 1 + 1; //SSE指令 無(wú)法在奔三之前的處理器運(yùn)行的,因?yàn)楸既安](méi)有sse指令,但是在奔三之前已經(jīng)有了VC6.0,llOne = llOne + 1;llTwo = llOne + llTwo;

這里直接來(lái)看反匯編:


這里有幾個(gè)重點(diǎn):

1.xorpd和xor差不多,只是他可以操作的是xmm寄存器(這個(gè)寄存器是64位的(8字節(jié)))

2.qword為4個(gè)字,4個(gè)字為8字節(jié).

3.adc:ADC指令的引入主要是為了實(shí)現(xiàn)多字節(jié)的運(yùn)算個(gè)。當(dāng)進(jìn)行32位以上運(yùn)算時(shí),要求低位字節(jié)相加,而高位字節(jié)再相加時(shí)就要考慮低位相加的進(jìn)位,即CF,這時(shí)就要用到ADC指令。


本人使用的vs2013,這里可以看到,的確有脫了褲子打屁的感覺(jué),邏輯上就是把long long搞成低8位,高8位,進(jìn)行操作。


下面是float類(lèi)型:

float fOne = 0, fTwo = 0;fOne = 1 + 1;fOne = fOne + 1;fTwo = fOne + fTwo;

其中對(duì)應(yīng)的反匯編代碼如下:


1.movss是將一個(gè)單精度數(shù)傳輸?shù)絰mm寄存器的低32位

也就是把0給了xmm0



而double類(lèi)型如下:

代碼如下:

//double類(lèi)型double dOne = 0, dTwo = 0;dOne = 1 + 1;dOne = dOne + 1;dTwo = fOne + fOne;

對(duì)應(yīng)的反匯編如下:


新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎(jiǎng)!定制產(chǎn)品紅包拿不停!

總結(jié)

以上是生活随笔為你收集整理的反汇编基础-加法的求值过程(各种类型)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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