【发布时间】:2018-04-12 21:00:12
【问题描述】:
我有一个简单的 c 程序,它将三个变量相乘和相加并返回结果。我已在 32 位机器上将代码编译成汇编语言(ATT 格式)。我正在尝试学习汇编代码,虽然我可以理解其中的一些行,但我需要帮助理解为什么例如 leal (%edx, %edx, 2), %edx 会在下面的代码中完成,比如结果是什么,它会完成什么?
汇编代码
.file "calc.c"
.text
.globl calc
.type calc, @function
calc:
pushl %ebp #prolog
movl %esp, %ebp #prolog
movl 8(%ebp), %edx #move %ebp +8 into %edx
movl 16(%ebp), %ecx #move %ebp +16 into %ecx
leal (%edx,%edx,2), %edx
movl 12(%ebp), %eax
leal (%edx,%eax,2), %eax
movl %ecx, %edx
sall $4, %edx
subl %ecx, %edx
addl %edx, %eax
popl %ebp
ret
.size calc, .-calc
.ident "GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3"
.section .note.GNU-stack,"",@progbits
C 程序
#include <stdio.h>
int calc(int x, int y, int z){
return 3*x + 2*y + 15*z;
}
int main(void) {
int x = 2;
int y = 6;
int z = 11;
int result = calc(x,y,z);
printf("x=%d, y=%d, z=%d, result=%d\n", x,y,z,result);
return 0;
}
有人可以帮我从序言开始追踪问题。
【问题讨论】:
-
您是否尝试过阅读手册?手册对
lea指令有何评论?(a,b,c)操作数表示法是怎么说的? -
告诉编译器进行优化。读取未优化的编译器生成的程序集很痛苦。
-
使用调试器、显示寄存器和单步执行单个汇编指令应该可以揭示您正在寻找的大部分内容。
-
另见at&t syntax :) 来自x86 tag wiki 的链接。如果您发现它更具可读性,
gcc -masm=intel也会产生 intel 语法输出。