2013-11-28 26 views
6

Quando si interrompe il main sembra che la linea in grassetto sia dove viene creato e inizializzato. Penso che mi stia sbagliando tutto questo, sto cercando di esaminare l'assembly x86_64 da un libro che sta spiegando x86. Questo sembra strano e sono abbastanza sicuro di non capire perché in questo libro dice che farà riferimento a una parola e dword come 4 byte. Se potessi ottenere una spiegazione per aiutare la mia incognita, sarebbe molto apprezzato. Prima assemblea di apprendimento, questo sta dicendo che la dimensione di una parola è di 8 byte?

 (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

Come hai capito da questo che una dimensione di parola è di 8 byte? – ScarletAmaranth

+0

Poiché il processore è a 64 bit, direi che la parola è lunga 64 bit, come confermato dagli indirizzi a sinistra. Quindi, sì, una parola è 8 byte. Forse il tuo libro si riferisce a un processore a 32 bit. – HAL9000

+0

@ La parola HAL9000 è lunga 64 bit? nope.jpg – ScarletAmaranth

risposta

7

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

  • byte: 8 bit
  • word: 2 byte
  • dword: 4 byte (sta per "parola doppia")
  • qword: 8 byte (acronimo di "quad parola")

Questo è un po 'in disaccordo con il solito significato di "parola": la natura a 16 bit di word è il risultato dell'evoluzione delle macchine x86 dalle loro origini a 16 bit, non un riflesso della naturale dimensione della parola della macchina. Per ragioni di compatibilità, la dimensione di un operando word deve sempre rimanere invariata, anche su una macchina a 64 bit.

Si noti che la variabile i nel programma è di 32 bit: è possibile vedere le annotazioni di dimensioni dword negli accessi di stack rilevanti. Potrebbe essere istruttivo ricompilare il programma con il tipo di i modificato in long int.

+0

Grazie, tornerò ad imparare la mia via d'uscita dalla boscaglia ora. –