1

x86 アセンブリ言語で実行時にレジスタのサイズ (バイト単位) を取得しようとしていますが、まだ可能かどうかわかりません。x86 アセンブリ言語では、実行時にレジスタのサイズを取得できますか? たとえば、レジ​​スタまたは変数 ( など) のサイズを取得し、ebxそれを別のレジスタ ( などeax) に移動することは可能ですか?

命令を実行しようとするとmov bx, sizeof bx、MASM アセンブラーが次のエラーを生成しました: 1>p4.asm(57): error A2009: syntax error in expression.

4

2 に答える 2

4

はい、そうしてください

mov eax, 4 ; eax = size of ebx in bytes

CPU レジスタのサイズは柔軟ではなく、固定されています。

変数については、変数の後にラベルを追加して、次のように違いを使用するだけです。

mystring db "blah blah blah",10,0
mystringend label $ ; or simply "mystringend:"
...
mov eax, mystringend - mystring ; or "offset mystringend - offset mystring"
于 2013-03-21T00:20:20.320 に答える
3

x86 アセンブリをプログラミングしている場合、汎用レジスタ (eaxおよびを含むebx) は常に 32 ビット ワードです。各レジスタの下位 16 ビット、およびそれらの 16 ビットの各バイトに個別にアクセスする命令がありますが、それらを明示的に使用し、各レジスタ内のデータの予想サイズのサイズを自分で追跡する必要があります。注意: x86_64 プログラミングを行っている場合、レジスタは 64 ビットに拡張され、名前はたとえばeaxからraxまたはに変更されr0ます。

アセンブリには変数などもありません。メモリアドレスを参照すると、メモリアクセスがバイト、ワード、ダブルワード、またはそれ以上であるかどうかをプロセスに伝えるオペコードビットがエンコードされます。MASM のようなアセンブラを使用している場合は、変数を特定のサイズに「宣言」することができます。その後、アセンブラは基本的な型チェックを追跡しますが、プロセッサ自体は変数の「サイズ」を知る方法がありません。変数。

于 2013-03-21T00:18:07.917 に答える