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
预先感谢您的帮助!