gpt4 book ai didi

assembly - 用 LEA 指令减去寄存器?

转载 作者:行者123 更新时间:2023-12-02 21:54:18 24 4
gpt4 key购买 nike

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

更标准的做法是什么?

我使用的是 2015 年 11 月 26 日在 MAC OSX 10.11 上编译的 NASM 版本 2.11.08

预先感谢您的帮助!

最佳答案

lea 指令不关心位移的符号。但您确实需要始终添加组件在一起。

mov rax, -1
lea rsi, [rsp + rax]

记住减 1 与加 -1 相同。

关于assembly - 用 LEA 指令减去寄存器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37642256/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com