単純なプロシージャーをx86-64アセンブリーで記述しようとしていますが、単純にint配列の長さを戻しています。配列の最後の要素は0で、これは数えてはなりません。配列はCコードからint *として渡されます。x86-64アセンブリー(AT&T構文)の配列要素の比較
次のように私のアセンブリコードは次のとおりです。
f1:
movq $0, %rax # zero out %rax
jmp test # jump to test
body:
incq %rax # increment %rax, which is counter and array index
test:
cmpq $0, (%rdi,%rax,4) # compare (rdi + (rax * 4)) to 0
jne body # jump if zero flag is not set
ret
これを実行すると、私はどちらか正しいが、乱暴に間違っていないではない結果を取得し、その代わりに11(配列のサイズ渡さマイナス0期)私は38を得る。私が考えているのは、私の比較ステートメントが間違っているということです。私の考えは、cmpqがレジスタを変更せずに(dest - src)実行するので、配列インデックスが0の場合は0から0になるので、ゼロフラグが設定されますが、それは起こっていないようです。任意の助けをいただければ幸い
movq (%rdi,%rax,4), %rax # %rax initially 0, so first element loaded into %rax
:
Iは、任意の正しい値を返す%のRAX、中に配列の任意の要素を読み込むことができます!
あなたのコードは非常に短く、あなたが考えるべきことをしていない部分だけを保ちました。あなたが思っていたことを説明するために、 –