When I break main it looks like the bold line is where i is being created and initialized. I think I'm going at this all wrong, I'm trying to examine x86_64 assembly from a book that is explaining x86. This seems weird and I'm pretty sure I just don't understand seeing as in this book he says he'll refer to a word and dword as 4-bytes. If I could get an explanation to aid my incognisance it would be greatly appreciated.
(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>
A byte is eight bits, a word is 2 bytes (16 bits), a doubleword is 4 bytes (32 bits), and a quadword is 8 bytes (64 bits).
WORD (16 bits/2 bytes)
The BYTE directive tells the assembler to reserve a block of storage and remember its length in bytes. The length is determined by the number of bytes in the initializer, which could be numbers between 0-255 decimal, or characters in single quotes.
word is a data type, 16 bits or 2 bytes in our case. So when we paraphrase your question, it becomes: For a two byte register can you move a data type larger than two bytes into it because since it's two bytes, it can fit a two byte space?
The terms used to describe sizes in the x86 architecture are:
byte
: 8 bitsword
: 2 bytesdword
: 4 bytes (stands for "double word")qword
: 8 bytes (stands for "quad word")This is somewhat at odds with the usual meaning of "word": the 16-bit nature of word
is a result of the evolution of x86 machines from their 16 bit origins, not a reflection of the natural word size of the machine. For compatibility reasons the size of a word
operand must always remain the same, even on a 64-bit machine.
Note that the variable i
in your program is 32 bits: you can see dword
size annotations in the relevant stack accesses. It may be instructive to recompile your program with the type of i
changed to long int
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With