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
预先感谢您的帮助!
该lea指令不关心位移的符号.但您确实需要始终将组件添加到一起.
mov rax, -1
lea rsi, [rsp + rax]
Run Code Online (Sandbox Code Playgroud)
记住减去1与添加-1相同.