Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

First time learning assembly, is this saying a word size is 8-bytes?

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>
like image 786
John Holly Avatar asked Nov 28 '13 18:11

John Holly


People also ask

How many bytes is a word assembly?

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).

How many bits is a word in assembly?

WORD (16 bits/2 bytes)

What does byte mean in assembly?

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.

What is a word in assembly?

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?


1 Answers

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

  • byte: 8 bits
  • word: 2 bytes
  • dword: 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.

like image 181
gsg Avatar answered Sep 19 '22 15:09

gsg