用 LEA 指令减去寄存器?
Subtracting registers with an LEA instruction?
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
更标准的做法是什么?
我正在使用 NASM 2015 年 11 月 26 日在 MAC OSX 10.11
上编译的 2.11.08 版
提前感谢您的帮助!
lea
指令不关心位移的符号。但是您确实需要始终 将 组件加在一起。
mov rax, -1
lea rsi, [rsp + rax]
记住减 1 等同于加 -1。
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
更标准的做法是什么?
我正在使用 NASM 2015 年 11 月 26 日在 MAC OSX 10.11
上编译的 2.11.08 版提前感谢您的帮助!
lea
指令不关心位移的符号。但是您确实需要始终 将 组件加在一起。
mov rax, -1
lea rsi, [rsp + rax]
记住减 1 等同于加 -1。