c - 汇编程序中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。我正确吗?
解决方案
lea
是“加载有效地址”。
指令集可以有一些相当复杂的多寄存器地址计算模式,这些模式通常只用于读取和写入数据到内存,但 lea 允许程序员获取指令访问的地址。
实际上,它在括号内执行计算,返回该值 - 它不访问内存(这是括号通常暗示的)。
在这种情况下,它被用作乘以 5 的快速方法,因为函数的其余部分已被优化掉!
推荐阅读
- node.js - how to create new array when using forEach
- rx-java - RxJava: how to make "generate" operator emit infinite stream lazily to downstream "concatMap"
- web-chat - How to debug Webchat in iPhone Simulator
- python - sending email using smtplib and SSL but receiver is no receiving it
- php - Inherit @IsGranted("ROLE_ADMIN") from parent route or controller
- javascript - 如何将 item.id 传递给 swipeButtons?
- amp-html - 在 AMP 页面中无需用户交互即可改变 DOM 对象
- typescript - 使用 glob 获取文件并要求
- javascript - Javascript/node.js 在服务器和客户端之间发送数据
- spring-boot - SpringBoot 不同的身份验证(MS AD 和 JWT)到一个控制器