首页 > 解决方案 > 汇编程序中eax寄存器的值

问题描述

我正在完成与 c 编程和汇编语言相关的作业。这是简单的c程序:

int multiply(int a, int b) {
    int k = 4; 
    int c,d, e;
    c = a*b ;
    d = a*b + k*c;
    return d;
}

它的优化组装是

_a$ = 8                                       ; size = 4
_b$ = 12                                                ; size = 4
_multiply PROC
        mov     eax, DWORD PTR _a$[esp-4]
        imul    eax, DWORD PTR _b$[esp-4]
        lea     eax, DWORD PTR [eax+eax*4]
        ret     0
_multiply ENDP

我想知道汇编中这行代码后eax寄存器的值

lea     eax, DWORD PTR [eax+eax*4]

我知道在程序集中添加整数时,它会将结果存储在目标中。当我们将它相乘时,它存储在 eax 中。所以如果我调用函数 multiply( 3 , 8 ),那一行之后的 eax 寄存器的值应该是 120。我正确吗?

标签: cassemblyx86cpu-registers

解决方案


lea是“加载有效地址”。

指令集可以有一些相当复杂的多寄存器地址计算模式,这些模式通常只用于读取和写入数据到内存,但 lea 允许程序员获取指令访问的地址。

实际上,它在括号内执行计算,返回该值 - 它不访问内存(这是括号通常暗示的)。

在这种情况下,它被用作乘以 5 的快速方法,因为函数的其余部分已被优化掉!


推荐阅读