2013-11-28 5 views
6

メインを壊すと、太い線が私が作成されて初期化されているように見えます。私はこのすべてが間違っていると思う、私はx86を説明している本からx86_64アセンブリを調べようとしている。これは奇妙に思えるし、私はこの本のように4バイトという単語とdwordを参照すると言っているのを理解できないと確信しています。私が私の認識を助けるために説明を得ることができれば、それは非常に高く評価されるだろう。 初回学習アセンブリですが、これはワードサイズが8バイトであることを示していますか?

 (gdb) list 
    1 #include <stdio.h> 
    2 
    3 int main() 
    4 { 
    5  int i; 
    6  for(i=0; i < 10; i++) 
    7  { 
    8   printf("Hello, world!\n"); 
    9  } 
    10  return 0; 
    (gdb) disassemble main 
    Dump of assembler code for function main: 
     0x0000000100000f10 <+0>: push rbp 
     0x0000000100000f11 <+1>: mov rbp,rsp 
     0x0000000100000f14 <+4>: sub rsp,0x10 
     0x0000000100000f18 <+8>: mov DWORD PTR [rbp-0x4],0x0 
     0x0000000100000f1f <+15>: mov DWORD PTR [rbp-0x8],0x0 
     0x0000000100000f26 <+22>: cmp DWORD PTR [rbp-0x8],0xa 
     0x0000000100000f2d <+29>: jge 0x100000f54 <main+68> 
     0x0000000100000f33 <+35>: lea rdi,[rip+0x48]  # 0x100000f82 
     0x0000000100000f3a <+42>: mov al,0x0 
     0x0000000100000f3c <+44>: call 0x100000f60 
     0x0000000100000f41 <+49>: mov DWORD PTR [rbp-0xc],eax 
     0x0000000100000f44 <+52>: mov eax,DWORD PTR [rbp-0x8] 
     0x0000000100000f47 <+55>: add eax,0x1 
     0x0000000100000f4c <+60>: mov DWORD PTR [rbp-0x8],eax 
     0x0000000100000f4f <+63>: jmp 0x100000f26 <main+22> 
     0x0000000100000f54 <+68>: mov eax,0x0 
     0x0000000100000f59 <+73>: add rsp,0x10 
     0x0000000100000f5d <+77>: pop rbp 
     0x0000000100000f5e <+78>: ret  
    End of assembler dump. </code> 
+0

どのようにしてワードサイズが8バイトであることが分かりましたか? – ScarletAmaranth

+0

プロセッサは64ビットなので、左側のアドレスで確認されているように、そのワードは64ビット長であると言います。そして、はい、単語は8バイトです。おそらくあなたの本は32ビットプロセッサを指しています。 – HAL9000

+0

@ HAL9000ワードの長さは64ビットですか? nope.jpg – ScarletAmaranth

答えて

7

The terms used to describe sizes in the x86 architecture are:

  • byte:8ビット
  • word:2バイト
  • dword:4バイト( "ダブルワード" の略)
  • qword:8バイト( "クワッドワード" の略)

これは「ワード」の通常の意味と幾分矛盾します。つまり、16ビットの性質wordは、マシンの自然な語サイズを反映したものではなく、16ビットの起源からのx86マシンの進化の結果です。互換性の理由から、wordオペランドのサイズは、64ビットマシンであっても常に同じでなければなりません。

プログラム内の変数iは32ビットであることに注意してください。関連するスタックアクセスでは、dwordサイズの注釈が表示されます。 iのタイプをlong intに変更してプログラムを再コンパイルすることは有益です。

+0

ありがとう、私は今スクラブフードから自分の道を学ぶことに戻るでしょう。 –

関連する問題