5

LEA 指令是否支持负位移?

mov rax, 1
lea rsi, [rsp - rax]

当我在我的 asm 文件中使用上面的代码时,我得到了错误:

$ nasm -f macho64 test.asm
$ error: invalid effective address

我知道我们可以在 C 中做这样的指针运算:

void foo(char *a, size_t b) {
    *(a - b) = 1;
}

然后我假设:

lea rsi, [rsp - rax]    

将工作。

我还尝试使用以下方法查看 GCC 编译器的作用:

$ gcc -S foo.c // foo.c has the function foo(above) in it

但我的 asm 知识不足以让我理解 GCC 编译器的 asm 输出。

谁能解释为什么:

lea rsi, [rsp - rax]    ;; invalid effective address

不起作用。我正在使用这些来实现相同的目标:

;; assume rax has some positive number
neg rax    
lea rsi, [rsp + rax]
neg rax

或者

sub rsp, rax
mov rsi, rsp
add rsp, rax

什么是更标准的做法?

我在 MAC OSX 10.11 上使用 2015 年 11 月 26 日编译的 NASM 版本 2.11.08

预先感谢您的帮助!

4

1 回答 1

10

lea指令不关心位移的符号。但是您确实需要始终组件添加在一起。

mov rax, -1
lea rsi, [rsp + rax]

请记住,减 1 与加 -1 相同。

于 2016-06-05T13:24:50.363 回答