第一次学习汇编,这是说一个字大小是8字节?

时间:2013-11-28 18:29:19

标签: assembly x86 size word x86-64

当我打破主要时,它看起来像粗线是我正在创建和初始化的地方。我想我错了,我正试图从一本解释x86的书中检查x86_64程序集。这看起来很奇怪,我很确定我只是不明白,因为在本书中他说他会将单词和双字称为4字节。如果我能得到一个解释来帮助我的认知,我将不胜感激。

    (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>

1 个答案:

答案 0 :(得分:16)

用于描述x86架构中大小的术语是:

  • byte:8位
  • word:2个字节
  • dword:4个字节(代表“双字”)
  • qword:8个字节(代表“四字”)

这与“word”的通常含义有些不一致:word的16位性质是x86机器从其16位起源的演变的结果,而不是自然字的反映机器的大小。出于兼容性原因,即使在64位计算机上,word操作数的大小也必须始终保持不变。

请注意,程序中的变量i为32位:您可以在相关的堆栈访问中看到dword大小注释。使用i更改为long int的类型重新编译您的程序可能会很有启发。