【发布时间】:2016-10-05 03:58:33
【问题描述】:
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 知识不足以让我理解 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
更标准的做法是什么?
我在 MAC OSX 10.11 上使用 2015 年 11 月 26 日编译的 NASM 版本 2.11.08
提前感谢您的帮助!
【问题讨论】:
-
因为CPU不支持这种操作?
-
mov rsi, rsp \ sub rsi, rax怎么样 -
@MikeCAT 很简单,您可以将其作为答案。谢谢!
-
@harold 看起来更好,谢谢!
-
ARM寻址方式可以加减索引寄存器,但是x86 can only add (with an optional scale factor).
标签: assembly x86 x86-64 pointer-arithmetic addressing-mode