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を使用しています
よろしくお願いします。