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 knowleage对我来说理解asm输出是不够的 来自GCC编译器。
任何人都可以解释原因:
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
更为标准的做法是什么?
我正在使用2015年11月26日在MAC OSX 10.11上编译的NASM版本2.11.08
提前感谢您的帮助!
答案 0 :(得分:8)
lea
指令并不关心位移的符号。但您确实需要始终添加组件。
mov rax, -1
lea rsi, [rsp + rax]
记住减去1与添加-1相同。