乘法运算

无符号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.mzph.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;上位机串口界面作为人机接口…