反汇编基础-加法的求值过程(各种类型)
首先看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)的反匯編如下:
總結(jié)
以上是生活随笔為你收集整理的反汇编基础-加法的求值过程(各种类型)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 反汇编基础-数据类型以及C++引用、指针
- 下一篇: Qt工作笔记-动态折线图(x轴坐标会改变