2013-11-28 11 views
6

Wenn ich main bricht, sieht es so aus, als wäre die fettgedruckte Zeile, wo ich erstellt und initialisiert werde. Ich denke, dass ich alles falsch mache, ich versuche, x86_64 Assembly aus einem Buch zu untersuchen, das x86 erklärt. Das scheint merkwürdig und ich bin mir ziemlich sicher, dass ich es nicht verstehe, wenn ich sehe, wie er in diesem Buch sagt, dass er sich auf ein Wort und ein Wort als 4 Bytes beziehen wird. Wenn ich eine Erklärung bekommen könnte, um meine Unkenntnis zu unterstützen, würde es sehr geschätzt werden. Zum ersten Mal lernen Assembly, ist dies eine Wortgröße ist 8 Bytes?

 (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

Wie haben Sie daraus abgeleitet, dass eine Wortgröße 8 Bytes beträgt? – ScarletAmaranth

+0

Da der Prozessor 64 Bit ist, würde ich sagen, dass das Wort 64 Bit lang ist, wie durch die Adressen auf der linken Seite bestätigt. Dann, ja, ein Wort ist 8 Bytes. Vielleicht bezieht sich Ihr Buch auf einen 32-Bit-Prozessor. – HAL9000

+0

@ HAL9000 Wort ist 64 Bit lang? nope.jpg – ScarletAmaranth

Antwort

7

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

  • byte: 8 Bits
  • word: 2 Byte
  • dword: 4 Byte (steht für "Doppelwort")
  • qword: 8 Bytes (steht für "quad Wort")

Dies ist etwas im Widerspruch zu der üblichen Bedeutung von "Wort": Die 16-Bit-Natur von word ist ein Ergebnis der Evolution von x86-Maschinen von ihren 16-Bit-Ursprüngen, nicht eine Reflektion der natürlichen Wortgröße der Maschine. Aus Kompatibilitätsgründen muss die Größe eines Operanden word immer gleich bleiben, auch auf einem 64-Bit-Rechner.

Beachten Sie, dass die Variable i in Ihrem Programm 32 Bits ist: Sie können dword Größenanmerkungen in den relevanten Stack-Zugriffen sehen. Es kann lehrreich sein, Ihr Programm mit dem Typ i, der auf long int geändert wurde, neu zu kompilieren.

+0

Danke, ich werde jetzt wieder meinen Weg aus dem Schrubber lernen. –