乘法運算

無符號mul和有符號imul,在編譯的過程中,先嘗試將乘法轉換成加法

或使用移位指令等周期轉移較短的指令,如果都沒有才用乘法指令

?

int main(int argc,char *argv)
{int nVarOne = argc;int nVarTwo = argc;// 變量乘常量 (非2的冪)printf("nVarOne * 11 = %d\n", nVarOne * 11);// 變量乘常量 (2的冪)printf("nVarOne * 16 = %d\n", nVarOne * 16);// 常量*常量printf("55 * 11 = %d\n", 55 * 11);// 復合運算printf("nVarOne * 8 + 5 = %d\n", nVarOne * 8 + 5);// 變量*變量printf("nVarOne*nVarTwo = %d\n", nVarOne*nVarTwo);std::cout << "Hello World!\n"; system("pause");
}

?

Debug版本反匯編:

int main(int argc,char *argv)
{
008D2650  push        ebp  
008D2651  mov         ebp,esp  
008D2653  sub         esp,0D8h  
008D2659  push        ebx  
008D265A  push        esi  
008D265B  push        edi  
008D265C  lea         edi,[ebp-0D8h]  
008D2662  mov         ecx,36h  
008D2667  mov         eax,0CCCCCCCCh  
008D266C  rep stos    dword ptr es:[edi]  
008D266E  mov         ecx,offset _E6D683D6_mul@cpp (08DE008h)  
008D2673  call        @__CheckForDebuggerJustMyCode@4 (08D1280h)  int nVarOne = argc;
008D2678  mov         eax,dword ptr [argc]  
008D267B  mov         dword ptr [nVarOne],eax  int nVarTwo = argc;
008D267E  mov         eax,dword ptr [argc]  
008D2681  mov         dword ptr [nVarTwo],eax  // 變量乘常量 (非2的冪)printf("nVarOne * 11 = %d\n", nVarOne * 11);
008D2684  imul        eax,dword ptr [nVarOne],0Bh  
008D2688  push        eax  
008D2689  push        offset string "nVarOne * 11 = %d\n" (08D9B30h)  
008D268E  call        _printf (08D1055h)  
008D2693  add         esp,8  // 變量乘常量 (2的冪)printf("nVarOne * 16 = %d\n", nVarOne * 16);
008D2696  mov         eax,dword ptr [nVarOne]  
008D2699  shl         eax,4  
008D269C  push        eax  
008D269D  push        offset string "nVarOne * 16 = %d\n" (08D9B48h)  
008D26A2  call        _printf (08D1055h)  
008D26A7  add         esp,8  // 常量*常量printf("55 * 11 = %d\n", 55 * 11);
008D26AA  push        25Dh  
008D26AF  push        offset string "55 * 11 = %d\n" (08D9B60h)  
008D26B4  call        _printf (08D1055h)  
008D26B9  add         esp,8  // 復合運算printf("nVarOne * 8 + 5 = %d\n", nVarOne * 8 + 5);
008D26BC  mov         eax,dword ptr [nVarOne]  
008D26BF  lea         ecx,[eax*8+5]  
008D26C6  push        ecx  
008D26C7  push        offset string "nVarOne * 8 + 5 = %d\n" (08D9B70h)  
008D26CC  call        _printf (08D1055h)  
008D26D1  add         esp,8  // 變量*變量printf("nVarOne*nVarTwo = %d\n", nVarOne*nVarTwo);
008D26D4  mov         eax,dword ptr [nVarOne]  
008D26D7  imul        eax,dword ptr [nVarTwo]  
008D26DB  push        eax  
008D26DC  push        offset string "nVarOne*nVarTwo = %d\n" (08D9B8Ch)  
008D26E1  call        _printf (08D1055h)  
008D26E6  add         esp,8  std::cout << "Hello World!\n"; 
008D26E9  push        offset string "Hello World!\n" (08D9BA8h)  
008D26EE  mov         eax,dword ptr [_imp_?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A (08DD0C8h)]  
008D26F3  push        eax  
008D26F4  call        std::operator<<<std::char_traits<char> > (08D1217h)  
008D26F9  add         esp,8  system("pause");
008D26FC  mov         esi,esp  
008D26FE  push        offset string "pause" (08D9BB8h)  
008D2703  call        dword ptr [__imp__system (08DD1C4h)]  
008D2709  add         esp,4  system("pause");
008D270C  cmp         esi,esp  
008D270E  call        __RTC_CheckEsp (08D128Ah)  
}

?

release版本通過ida查看

text:00401040                 push    ebp
.text:00401041                 mov     ebp, esp
.text:00401043                 push    esi
.text:00401044                 mov     esi, [ebp+argc]
.text:00401047                 imul    eax, esi, 0Bh
.text:0040104A                 push    eax
.text:0040104B                 push    offset _Format  ; "nVarOne * 11 = %d\n"
.text:00401050                 call    _printf
.text:00401055                 mov     eax, esi
.text:00401057                 shl     eax, 4
.text:0040105A                 push    eax
.text:0040105B                 push    offset aNvarone16D ; "nVarOne * 16 = %d\n"
.text:00401060                 call    _printf
.text:00401065                 push    25Dh
.text:0040106A                 push    offset a5511D   ; "55 * 11 = %d\n"
.text:0040106F                 call    _printf
.text:00401074                 lea     eax, ds:5[esi*8]
.text:0040107B                 push    eax
.text:0040107C                 push    offset aNvarone85D ; "nVarOne * 8 + 5 = %d\n"
.text:00401081                 call    _printf
.text:00401086                 imul    esi, esi
.text:00401089                 push    esi
.text:0040108A                 push    offset _Val     ; "nVarOne*nVarTwo = %d\n"
.text:0040108F                 call    _printf
.text:00401094                 mov     ecx, ds:__imp_?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A.gap0 ; _Ostr
.text:0040109A                 call    ??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z ; std::operator<<<std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &,char const *)
.text:0040109F                 push    offset Command  ; "pause"

?

轉載于:https://www.cnblogs.com/xiangtingshen/p/11163498.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/392742.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/392742.shtml
英文地址,請注明出處:http://en.pswp.cn/news/392742.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

leetcode 381. O(1) 時間插入、刪除和獲取隨機元素 - 允許重復

設計一個支持在平均 時間復雜度 O(1) 下&#xff0c; 執行以下操作的數據結構。 注意: 允許出現重復元素。 insert(val)&#xff1a;向集合中插入元素 val。 remove(val)&#xff1a;當 val 存在時&#xff0c;從集合中移除一個 val。 getRandom&#xff1a;從現有集合中隨機…

MAYA建模桌面一角_maya怎么建模逼真的學生書桌書桌桌面?

今天我們就來看看使用maya建模學生書桌的方法&#xff0c;這是實例教程&#xff0c;請看下文詳細介紹。NURBS曲線的基礎知識&#xff1a;NURBS曲面是由網狀的曲線組合而成&#xff0c;在maya中可以使用creat菜單下的CV Curve Tool(CV曲線工具)EP Curve Tool(EP曲線工具)來創建曲…

expect 批量修改服務器用戶密碼

每個技術人員離職&#xff0c;留下的人 就要修改他的服務器賬號密碼&#xff0c;很麻煩&#xff0c;故寫次腳本偷懶 change.sh 如下 12345678910#!/bin/bashfor i in awk {print $1} account.txt dojawk -v l"$i" {if(l$1)print $2} account.txt aawk -v l"$i&q…

虛擬機安裝服務器2008,VMware Workstation 虛擬機安裝64位windows 2008 R2 系統

偶看現在使用的電腦是 惠普 康柏 Elite 8300 MT Mini Tower&#xff0c;操作系統 Windows 7 旗艦版 64位基本硬件展示處理器 英特爾 第三代酷睿 i5-3470 3.20GHz 四核主板 惠普 3397內存 8 GB ( 記憶科技 DDR3 1600MHz / 鎂光 DDR3 1600MHz )主硬盤 西數 WDC WD5000AAKX-60U6A…

黑客入門之單機游戲外掛

轉載于: http://www.cnblogs.com/huipengbo/p/6887170.html 一.本文以植物大戰僵尸外掛的編寫為例&#xff0c;介紹單機游戲外掛的編寫和使用過程。 1.啟動單機游戲如&#xff1a;植物大戰僵尸如下圖 2.想明白我們寫外掛的目的&#xff1a;讓我們有充足的陽光數量來使用&#x…

如何使用瀏覽器控制臺通過JavaScript抓取并將數據保存在文件中

by Praveen Dubey通過Praveen Dubey 如何使用瀏覽器控制臺通過JavaScript抓取并將數據保存在文件中 (How to use the browser console to scrape and save data in a file with JavaScript) A while back I had to crawl a site for links, and further use those page links …

poj2017

1&#xff0e;鏈接地址 https://vjudge.net/problem/POJ-2017 2&#xff0e;問題描述 Bill and Ted are taking a road trip. But the odometer in their car is broken, so they dont know how many miles they have driven. Fortunately, Bill has a working stopwatch, so t…

NFL原則告訴我們做決策的時候,試圖找到一個能解決所有問題,“大而全”的方案是不存在的。我們應當找到最關心的問題,因地制宜做出選擇。——聚焦目標,取舍有道!...

資源匱乏原則&#xff1a; 有限的資源無法滿足無窮的需要及欲望&#xff1b; 因此想要多一點的某件東西&#xff0c;意味著必須放棄一些其他的東西&#xff1b; 因為資源匱乏&#xff0c;所以我們必須做出選擇。 NFL原則&#xff1a;沒有免費午餐定理(No Free Lunch)是wolpert和…

巨無霸Win8PE X64服務器維護專用,【13年4月4日】維護版win8pe【32位+64位+純64位】(支持BIOS+EFI)...

因為單獨一個PE是不夠用的&#xff0c;已經制作了合盤&#xff0c;可BIOS啟動&#xff0c;也可EFI啟動。詳情移步》歡迎下載使用&#xff0c;覺得好的話&#xff0c;請回帖支持一下&#xff0c;您的支持&#xff0c;就是我的動力。。。。預祝大家新的一年合家歡樂&#xff01;工…

linux子線程運行的函數_Linux中線程使用詳解

4. 線程的屬性前面還說到過線程創建的時候是有屬性的&#xff0c;這個屬性由一個線程屬性對象來描述。線程屬性對象由pthread_attr_init()接口初始化&#xff0c;并由pthread_attr_destory()來銷毀&#xff0c;它們的完整定義是&#xff1a;int pthread_attr_init(pthread_attr…

數據源 連接oracle

https://blog.csdn.net/kk185800961/article/details/53065257 轉載于:https://www.cnblogs.com/BelieveFish/p/11164009.html

leetcode 140. 單詞拆分 II(記憶化)

給定一個非空字符串 s 和一個包含非空單詞列表的字典 wordDict&#xff0c;在字符串中增加空格來構建一個句子&#xff0c;使得句子中所有的單詞都在詞典中。返回所有這些可能的句子。 說明&#xff1a; 分隔時可以重復使用字典中的單詞。 你可以假設字典中沒有重復的單詞。 …

java mvp開發_如何從沒有軟件開發技能的想法變成現實的市場MVP???

java mvp開發by Mike Williams由Mike Williams 如何從沒有軟件開發技能的想法變成現實的市場MVP&#xff1f;?&#xff1f; (How to go from idea to live marketplace MVP with no software development skills ???) Online marketplaces such as Airbnb, Turo, Hipcamp,…

Convolutional neural networks for artistic style transfer

https://harishnarayanan.org/writing/artistic-style-transfer/ 轉載于:https://www.cnblogs.com/guochen/p/6888478.html

Centos 安裝 禪道

Centos 安裝 禪道 一、環境準備&#xff1a; 1、服務器&#xff1a;Centos6.7 新系統 2、查看對應的系統版本&#xff1a;uname -a和cat /etc/redhat CentOS release 6.7 (Final) 二、安裝&#xff1a; 1、下載對應系統版本的zbox禪道一鍵安裝包&#xff0c;解壓至/opt目錄下 …

centos7修改服務器密碼忘記,Centos7忘記root密碼怎么修改

Centos7忘記root密碼怎么修改一、 reboot重啟機器&#xff0c;當出現引導界面時&#xff0c;按e進入內核編輯界面。二、 往下翻&#xff0c;到LANGzh_CN.UTF-8后面添加 \rd.break(別忘了空格)三&#xff0c; 修改完成后&#xff0c;按下CtrlX組合鍵來運行這個修改后的內核程序(…

1.移動端測試知識筆記(面試必備,測試點,adb命令)

移動端測試&#xff1a; 移動應用&#xff0c;特性(功能) 滿足 需求(產品文檔&#xff0c;隱性需求) 一。App功能測試&#xff1a; 死活背下來1.業務邏輯正確性測試&#xff1a; 產品文檔&#xff0c;隱性需求- 寫成測試用例 2.兼容性測試&#xff1a; 1.系統版本&#xff1a…

Day 3 網絡基礎

網絡基礎 一、什么是互聯網協議及為何要有互聯網協議 &#xff1f; 互聯網協議&#xff1a;指的就是一系列統一的標準&#xff0c;這些標準稱之為互聯網協議。互聯網的本質就是一系列的協議&#xff0c;總稱為‘互聯網協議’&#xff08;Internet Protocol Suite)。 互聯網協議…

leetcode 349. 兩個數組的交集

給定兩個數組&#xff0c;編寫一個函數來計算它們的交集。 示例 1&#xff1a; 輸入&#xff1a;nums1 [1,2,2,1], nums2 [2,2] 輸出&#xff1a;[2] 示例 2&#xff1a; 輸入&#xff1a;nums1 [4,9,5], nums2 [9,4,9,8,4] 輸出&#xff1a;[9,4] 代碼 class Solution…

a4988 脈寬要求_基于STM32的微型步進電機驅動控制器設計

基于STM32的微型步進電機驅動控制器設計摘 要&#xff1a; 設計了一種微型步進電機驅動控制器&#xff0c;通過上位機界面修改步進電機轉速、旋轉角度、細分系數。該設計以STM32F103T8U6作為主控制器&#xff0c;以A4988步進電機驅動設備&#xff0c;上位機串口界面作為人機接口…