2

.dataで宣言された文字のバイト配列があります

chars db 'spipopd'

そして、この配列のベースインデックスを指すようにrdiを設定しました

mov rdi, chars

ある時点で、配列の文字を8ビットレジスタに入れたいと思います。void以下の最初のステートメントは有効な値を生成しますが、2番目のステートメントはgdbコマンドを入力するとr9bに含まれますprint $r9b

mov al, [rdi]   ; produces valid value in gdb
mov r9b, [rdi]  ; r9b = void, according to gdb

レジスタr8bからr15bのいずれも同じ効果があります。私が理解しているように、とは両方ともal8r9bビットですが、なぜ一方が機能し、もう一方が機能しないのですか?私の勘では、どちらも8ビットのサイズですが、微妙な違いがあり、私にはわかりません。

Intelのドキュメントには次のように記載されています。

「REXプレフィックスは、64ビットのオペランドサイズまたは参照レジスタR8〜R15を生成するために使用されます。」

これは私の問題に関連していますか?

4

1 に答える 1

1

「void」は実際にはレジスタが持つことができる値ではないため、gdbはr9bをレジスタ名として認識していないように見えます。

下位バイトレジスタr9br9l、には2つの異なる表記法があり、異なるソースは異なる名前を使用することに注意してください。

mainでランダムなプログラムを壊して自分で試してみると、次の出力が得られます。

(gdb) print $r9b
$1 = void
(gdb) print $r9l
$2 = 16

どうやらgdbは$r9l表記法しか認識しません。

于 2012-07-22T18:32:37.060 に答える