首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

请帮小弟我解释一下这个汇编:shl eax,0

2013-03-26 
请帮我解释一下这个汇编:shl eax,0我写了一个测试内联函数的C++程序,然后反汇编看是否存在函数调用,但是红

请帮我解释一下这个汇编:shl eax,0
我写了一个测试内联函数的C++程序,然后反汇编看是否存在函数调用,但是红色这些地方我不是很懂,希望大家帮我看看:

以下是我写的源代码:
#include <iostream>
#include <cmath>
using namespace std;

void boxVolume( int length = 1, int width = 1, int height = 1 );
inline void boxVolume( int length, int width, int height )
{
int vol;
vol = length * width * height;


int main()
{
boxVolume();

boxVolume(10);

  boxVolume(10,5);

boxVolume(10,5,2);
return 0;


主函数内反汇编得到的代码是:
boxVolume();
01151027 mov eax,1  
0115102C shl eax,0 我不懂的是这里是左移0位,既然是左移0位,干嘛还要写出了,不是等于不做吗??
0115102F mov dword ptr [ebp-4],eax  

boxVolume(10);
01151032 mov ecx,0Ah  
01151037 shl ecx,0
0115103A mov dword ptr [ebp-8],ecx  

  boxVolume(10,5);
0115103D mov edx,0Ah  
01151042 imul edx,edx,5  
01151045 mov dword ptr [ebp-0Ch],edx  

boxVolume(10,5,2);
01151048 mov eax,0Ah  
0115104D imul eax,eax,5  
01151050 shl eax,1  
01151052 mov dword ptr [ebp-10h],eax  





[解决办法]
应该是编译器做了优化但又优化不彻底导致的吧,如果不优化,那么就是按步就班做2次乘法,但是这个简单函数被内联展开,再加上你的实参都是编译期常数,它可以做较大的优化,根据实际参数值对原始指令做了删调,但机器不是人,只能按规则行事,总会漏下一些让人类一眼看去就觉好笑的破绽,可以理解
[解决办法]
哪里看debug版本的汇编的, 看了vc和gcc的结果, main都优化成空函数..
稍微改下就看到都优化成常数..

[解决办法]

探讨

引用:

应该是编译器做了优化但又优化不彻底导致的吧,如果不优化,那么就是按步就班做2次乘法,但是这个简单函数被内联展开,再加上你的实参都是编译期常数,它可以做较大的优化,根据实际参数值对原始指令做了删调,但机器不是人,只能按规则行事,总会漏下一些让人类一眼看去就觉好笑的破绽,可以理解


那这个优化也太奇怪了吧,如果是这样,那不如一个mov dword ptr [e……

[解决办法]
01151050 shl eax,1

你查看一下指令字节,这行指令只需两个字节

没有更短更快的指令能做到乘以2
[解决办法]
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……

对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!

热点排行