【问题标题】:First time learning assembly, is this saying a word size is 8-bytes?第一次学汇编,这是说字长是8字节吗?
【发布时间】:2013-12-14 21:11:34
【问题描述】:

当我中断 main 时,看起来粗线是 i 被创建和初始化的地方。我想我完全错了,我试图从一本解释 x86 的书中检查 x86_64 程序集。这看起来很奇怪,我很确定我只是不明白在这本书中看到他说他将一个单词和 dword 称为 4 字节。如果我能得到一个解释来帮助我的无知,那将不胜感激。

 (gdb) 列表
    1 #include 
    2
    3 int main()
    4 {
    5个整数我;
    6 for(i=0; i :推送rbp
       0x0000000100000f11 : mov rbp,rsp
       0x0000000100000f14 : sub rsp,0x10
       0x0000000100000f18 : mov DWORD PTR [rbp-0x4],0x0
       0x0000000100000f1f : mov DWORD PTR [rbp-0x8],0x0
       0x0000000100000f26 : cmp DWORD PTR [rbp-0x8],0xa
       0x0000000100000f2d : jge 0x100000f54 
0x0000000100000f33 : lea rdi,[rip+0x48] # 0x100000f82 0x0000000100000f3a : 移动,0x0 0x0000000100000f3c : 调用 0x100000f60 0x0000000100000f41 : mov DWORD PTR [rbp-0xc],eax 0x0000000100000f44 : mov eax,DWORD PTR [rbp-0x8] 0x0000000100000f47 : 添加eax,0x1 0x0000000100000f4c : mov DWORD PTR [rbp-0x8],eax 0x0000000100000f4f : jmp 0x100000f26
0x0000000100000f54 : 移动 eax,0x0 0x0000000100000f59 : 添加rsp,0x10 0x0000000100000f5d : 弹出 rbp 0x0000000100000f5e : ret 汇编程序转储结束。

【问题讨论】:

  • 你是怎么知道一个字的大小是 8 个字节的?
  • 由于处理器是 64 位的,我会说这个字的长度是 64 位,正如左边的地址所证实的那样。那么,是的,一个字是8个字节。也许你的书提到了 32 位处理器。
  • @HAL9000 字是 64 位长吗? nope.jpg
  • “单词”这个词在过去意味着某些东西,那时数据总线的大小与 ALU 和寄存器的大小相匹配。那些日子早已一去不复返了,这个词变得无可救药地模棱两可。像最初的 Pentium 这样的 32 位处理器已经使用了 64 位数据总线。而 64 位处理器具有 48 位地址总线。如果这本书经常谈论“词”,那么你肯定应该再找一个。
  • 嗯,不,没有 x86_64 编译器为 int 使用 8 个字节。太贵了。 64 位架构不会为您购买两倍的缓存。

标签: assembly x86 size word x86-64


【解决方案1】:

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

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

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

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

【讨论】:

  • 值得注意的是l(“长字”)和movl一样,也是4字节的意思。
猜你喜欢
  • 1970-01-01
  • 2012-11-16
  • 1970-01-01
  • 2011-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多