我正在尝试理解这条线是如何工作的:
lea (%eax, %eax, 4), %eax
所以看起来这基本上说:
%eax = 5* %eax
但LEA是视为签名还是未签名?
答案 0 :(得分:8)
LEA
并非真正用于算术运算,而是用于计算内存操作的绝对地址。
签名和未签名操作之间没有区别;在这种情况下,签名操作和无符号操作的结果是相同的。
据我所知,使用LEA
指令不可能将寄存器与负常数相乘
答案 1 :(得分:1)
这更适合作为评论,但评论没有代码格式。正如其他评论和Martin的回答所暗示的,你可以做类似以下的事情(气体语法):
// %ecx has a size in it
neg %ecx
lea (%esp, %ecx, 4), %esp /* subtract %ecx*4 from stack ptr */
neg %ecx
......与以下内容相比:
lea (,%ecx,4), %edx
sub %edx, %esp
......或:
lea (,%ecx,4), %edx
neg %edx
lea (%esp,%edx), %esp
我无法评论性能差异,但sub
会更改标记而lea
则不会。