2013-03-03 3 views
16

アセンブリレジスタの理解では、各レジスタは32ビットコード全体でアクセスでき、複数のアクセス可能なレジスタに分割されています。この例ではEAXが32ビットレジスタである場合、AXを呼び出すと、最初の16ビットが返されます。AHまたはALを呼び出すと、16ビットの次の8ビットを返し、ALは最後の8ビットを返します。アセンブリプログラミングメモリEAXとAxe、AH、ALの割り当て

私の質問は、私は本当に信じていないので、これは動作する方法です。私たちは7の32ビット値を格納する場合は...別名EAX

0000 0000 0000 0000 0000 0000 0000 0111 

を格納し、我々はAX呼び出すのであれば、それは我々がAHを呼び出す場合、それは

0000 0000 
を返す必要があります

0000 0000 0000 0000 

を返す必要があります

とし、ALとすると、返信する必要があります。

0000 0111 

これは間違いありませんか? AHへの呼び出しがどのような値であれば本当に提供しますか?

+0

いいえ、あなたのAXの価値は間違っています。最後の16ビットをハックします。 AHはEAXのビット8〜15を返します。 –

+1

ビットパターンをあなたの質問の文脈の中で理解しやすいもので置き換えてください。例えば0000 0001 0010 0011 ... –

答えて

33

いいえ、そうではありません。

EAX is the full 32-bit value 
AX is the lower 16-bits 
AL is the lower 8 bits 
AH is the bits 8 through 15 (zero-based) 

編集:

は完全を期すために、32ビットCPUに基づいた、上記に加えて、64ビットIntel/AMD CPUは無

RAX, which hold a 64-bit value, and where EAX is mapped to the lower 32 bits. 
+0

私の誤解は、Axがトップ16であることから来ると言いますが、代わりにAlとAhの両方を含む値? – Randy

+0

助けてくれてありがとうございました。このような愚かなエラー – Randy

+0

あなたはどのように高い16ビット、および高い32ビットを呼び出すか? EAXHまたはAXHはありますか? – user97662

4

を有します - ALはAXの最下位8ビットです。 AXはEAXの最下位16ビットです。

おそらく、eaxで04030201hで始まる場合は対処するのが最も簡単です。この場合、AXは0201hを含み、AHは02hを含み、ALは01hを含む。

18

AXは、EAXの下位16ビットです。 AHはAXの上位8ビット(EAXのビット8-15)であり、ALはEAXの最下位バイト(ビット0-7)とAXです。

例(16進数):

EAX:12 34 56 78

AX:56 78

AH:56

AL:78の

4

ないあなたのANSはありません間違っている

AlとAhの選択は、AXからではなく、EAXから

e。グラム

EAX=0000 0000 0000 0000 0000 0000 0000 0111 

だから我々は、AXを呼び出す場合、それは我々がAHを呼び出す場合、それは

0000 0000 

を返す必要があります

0000 0000 0000 0111 

返すべきであると私たちはALを呼び出すときには、

0000 0111 
を返す必要があります

例番号2

EAX: 22 33 55 77 
AX: 55 77 
AH: 55  
AL: 77 

例3

EAX: 1111 0000 0000 0000 0000 0000 0000 0111  
AX= 0000 0000 0000 0111 
AH= 0000 0000 
AL= 0000 0111 
+1

エンディアンと関係がありますか?私が 'movl $ 0x01%eax'を_GAS_でアセンブルすると、'%ax'と '%al'の値はどうなりますか? 1つまたはゼロ? –

+0

@FrozenFlame:いいえ、エンディアンはメモリにのみ適用されます( 'mov $ imm32、%eax'命令が' opcode 01 00 00 00'としてどのようにコード化されるかを含みます)。 %alの値は '1'になります。左シフトの%eaxは、左側のMSB、右側のLSBを考えると機能します。 (これはベクタレジスタには厄介なことがあります。https://stackoverflow.com/questions/41351087/convention-for-displaying-vector-registersを参照してください) –

3

以下のスニペットは、GDBを使用EAXを調べます。

(gdb) info register eax 
    eax   0xaa55 43605 
    (gdb) info register ax 
    ax    0xaa55 -21931 
    (gdb) info register ah 
    ah    0xaa -86 
    (gdb) info register al 
    al    0x55 85 
  1. EAX - フル32ビット値
  2. AX - 下位16ビットの値
  3. AH - 8から15ビット
  4. AL - EAX/AXの下位8ビット
+0

gdbのレジスタを 'p/x $ eax'小数点の場合は '/ x'を省略してください)。そして、 'set $ eax = 0xdeadbeef'、IIRCでそれらを修正してください。 asmのgdbに関するヒントについては、[x86タグwiki](https://stackoverflow.com/tags/x86/info)の一番下を参照してください。 –

関連する問題