汇编指针算术LEA指令

use*_*453 5 assembly pointer-arithmetic

LEA指令是否支持负位移?

mov rax, 1
lea rsi, [rsp - rax]
Run Code Online (Sandbox Code Playgroud)

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

$ nasm -f macho64 test.asm
$ error: invalid effective address
Run Code Online (Sandbox Code Playgroud)

我知道我们可以在C中做这样的事情:

void foo(char *a, size_t b) {
    *(a - b) = 1;
}
Run Code Online (Sandbox Code Playgroud)

那我假设:

lea rsi, [rsp - rax]    
Run Code Online (Sandbox Code Playgroud)

将工作.

我还尝试使用以下命令查看GCC编译器的功能:

$ gcc -S foo.c // foo.c has the function foo(above) in it
Run Code Online (Sandbox Code Playgroud)

但是我的asm knowleage对我来说还不够理解GCC编译器的asm输出.

谁能解释原因:

lea rsi, [rsp - rax]    ;; invalid effective address
Run Code Online (Sandbox Code Playgroud)

不起作用.我正在使用它们来实现同样的目标:

;; assume rax has some positive number
neg rax    
lea rsi, [rsp + rax]
neg rax
Run Code Online (Sandbox Code Playgroud)

要么

sub rsp, rax
mov rsi, rsp
add rsp, rax
Run Code Online (Sandbox Code Playgroud)

这样做的标准方法是什么?

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

预先感谢您的帮助!

Sep*_*and 8

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

mov rax, -1
lea rsi, [rsp + rax]
Run Code Online (Sandbox Code Playgroud)

记住减去1与添加-1相同.