5

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を使用しています

よろしくお願いします。

4

1 に答える 1