反汇编基础-乘法与除法
生活随笔
收集整理的這篇文章主要介紹了
反汇编基础-乘法与除法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
首先來看乘法:
兩個變量之積
int nOne = 1;int nTwo = 2;int nOther = nOne * nTwo;其反匯編如下:
從這里可以看到,兩個變量之乘積,
把nOne中的值放到ptr指向的地方,把2放到ptr指向的地址;把nOne的值給eax
imul就是乘積,最后再把eax乘積的值放到nOther中。
?
下面是一個變量的值乘一個常量:
代碼如下:
nOther = nOne * 3;反匯編如下:
這里可以知道把nOne的值放到eax中,然后把常量3直接和eax相乘;
?
下面是一個變量和2的倍數相乘:
nOther = nOne * 2;反匯編如下:
這里的shl是邏輯左移,這個效率比imul高,這個邏輯左移和C/C++中的<<一樣;
int nOne = 10;int nTwo = 2;int nOther = nOne / nTwo;nOther = nOne / 2;nOther = nOne / 3;nOther = (-nOne) / 2;nOther = nOne / -2;這里先介紹這個指令:
cdq:把EAX(32位)和EDX(32位)拼湊在一起:
EDX為高位,EAX為低位;如果EAX為正數則用0填充EDX,如果為負數就用1填充EDX;
cdq經常與idiv除法指令同時出現:
除法一般要用到兩個寄存器,一個低位,一個高位,低位放商,高位放余數;
?
sar指令是邏輯右移,相當與C/C++中的 >>?
?
neg為補碼操作符
?
當除以2的倍數時,也會向乘法英語進行優化
?
如下匯編代碼:
這里要說明下為什么有的會存在
為什么要在邏輯右移的操作上要進行一個減法操作!
負數是通過補碼進行計算的!
比如-3
如果直接右移他的結果就是-2;在前面進行一個sub就是為了得到正確的結果
總結
以上是生活随笔為你收集整理的反汇编基础-乘法与除法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端笔记-JavaScript中放jso
- 下一篇: QML工作笔记-文本输入设置长度以及回显