LEA是执行有符号还是无符号算术?

时间:2014-04-02 11:33:19

标签: assembly x86

我正在尝试理解这条线是如何工作的:

lea (%eax, %eax, 4), %eax

所以看起来这基本上说:

%eax = 5* %eax

但LEA是视为签名还是未签名?

2 个答案:

答案 0 :(得分:8)

  1. LEA并非真正用于算术运算,而是用于计算内存操作的绝对地址。

  2. 签名和未签名操作之间没有区别;在这种情况下,签名操作和无符号操作的结果是相同的。

  3. 据我所知,使用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则不会。