【问题标题】:Advice regarding what this assembler is doing MOVs for?关于这个汇编程序正在做什么 MOV 的建议?
【发布时间】:2014-03-12 22:32:10
【问题描述】:

这个 C++:

int my_func(int y, int t){
    int m = 0;
    m= y*t;
    return m;
}

int main(){
    int h = my_func(1,2);
    return 1;
}

生产这个 x86:

int main(){
push        ebp  
mov         ebp,esp  
sub         esp,8  
    int m = my_func(1,2);
mov         dword ptr [ebp-4],0  
mov         eax,1
imul        eax,eax,2  
mov         dword ptr [ebp-4],eax     ;Why?
mov         ecx,dword ptr [ebp-4]     ;Why?
mov         dword ptr [m],ecx         ;Why?
    return 1;
mov         eax,1  
}
mov         esp,ebp  
pop         ebp  
ret

我不明白为什么m 的值已经包含在寄存器eax 中,在imul 之后需要三个mov

是不是因为eax 必须用于return 1 行,所以eax 是一个特殊的寄存器?

另外,dword ptr [ebp-4] 到底指的是什么?是1还是2?

【问题讨论】:

  • 您是否使用任何级别的优化进行编译?
  • @Leeor 否,因为如果我这样做了,我不会有 imul 指令,我只会返回值 2....(我希望函数被内联)跨度>
  • 冗余负载的原因是因为您选择构建未优化的代码。
  • +1 - 虽然编译器输出它所做的代码会有逻辑上的原因,但不进行优化的编译几乎总是会输出冗余代码。

标签: assembly x86 mov


【解决方案1】:

[ebp-4] 是 my_func 的 m 的本地副本存储在堆栈中的位置。 [m] 是存储 m 的 main 本地副本的位置。这里缺少的是 main 的 m 副本的定义。我本来希望它也可以抵消 ebp 的。使用 VS2005,我编译了这个例子,使用 volatile 来防止优化掉多个。

__inline int myfun(int a, int b)
{
int m;
    m = a*b;
    return (m);
}

int main (void)
{
volatile int a, b, m;
    a = 1;
    b = 2;
    m = myfun(a, b);
    return(0);
}

并得到了这个汇编代码。注意 m 和 a 共享同一个内存位置:-4[ebp+8]:

_b$ = -8                                                ; size = 4
_m$ = -4                                                ; size = 4
_a$ = -4                                                ; size = 4
_main   PROC
        sub     esp, 8
        mov     DWORD PTR _a$[esp+8], 1
        mov     DWORD PTR _b$[esp+8], 2
        mov     ecx, DWORD PTR _b$[esp+8]
        mov     eax, DWORD PTR _a$[esp+8]
        imul    eax, ecx
        mov     DWORD PTR _m$[esp+8], eax
        xor     eax, eax
        add     esp, 8
        ret     0

【讨论】:

    猜你喜欢
    • 2010-11-19
    • 2016-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-01
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多