奇怪的数据大小?

时间:2015-09-13 09:53:15

标签: x86 gdb size

1 Byte = 8bits
1 Halfword = 16bits = 2 Bytes
1 Word = 32 bits = 4 Bytes
1 Long = 64 bits = 8 Bytes

但是在x86汇编(AT& T语法)中,我使用movw(移动字)将半字移动到16位寄存器,movl(移动长)将字移动到32位寄存器。我在运行32位操作系统的64位操作系统上使用虚拟机。

我做错了什么?

这是否意味着在我的VM中运行的操作系统中,大小为:

1 Byte = 4bits
1 Halfword = 8bits = 2 Bytes
1 Word = 16 bits = 4 Bytes
1 Long = 32 bits = 8 Bytes

我在GDB上检查了尺寸,我认为它们是:

1 Byte = 8bits
1 Halfword = 16bits = 2 Bytes
1 Word = 32 bits = 4 Bytes
1 Long = 64 bits = 8 Bytes 

2 个答案:

答案 0 :(得分:1)

术语字大小或machine word通常是指寄存器的大小以及本机加载/存储的大小。维基百科的文章提到了我在这个答案中写的一些相同的东西。

对于64位系统,一个字可能意味着8个字节。 IDK,你得到了Halfword = 16b / Word = 32b列表的列表。

对于x86,单词最初为16位。 (我猜x86的8位唯一的祖先并没有使用术语"字",因为他们只能说"字节")。当x86扩展为32位模式(i386)时,不重命名所有内容就不那么容易了。

除了某些历史计算机体系结构外,

字节始终是8位的八位字节。有一些有9位字节。 C标准仍然不要求CHAR_BIT = 8,因此要编写完全可移植的代码,您不能假设或2补充有符号整数。

所以在x86文档和asm助记符/语法中:

  • B =字节= 8位(PADDB在向量中添加8位整数)
  • W = word = 16bits(PADDW在向量中添加16位整数)
  • D = long或dword(双字)= 32位(PADDD在向量中添加32位整数)
  • Q =四字= 64位(PADDQ在向量中添加64位整数)
  • DQ = double-quad(有时也是oct-word)= 128b(movdqa复制对齐128b。PUNPCKLQDQ:交错 L ow两个64位 Q 128b src的单词并转入 DQ 目的地。)

AVX movdqa ymm0, [rdi]是32B负载,即使它仍然使用相同的助记符。 AVX更像是多个128b通道而不是真正的原生256b向量,所以这种方式证明了这一点。

在NASM语法中,有时需要像mov ax, word ptr [rdi]这样的语法来指定操作数大小,而不是从dest寄存器中推断它。 AT& T语法使用助记符上的后缀来指定操作数大小,如果您不想隐藏它并从寄存器的选择中推断:movw (%rdi), %ax

助记符中的B / W / D事物早于向量扩展,在字符串移动指令中作为一个示例。 STOS确实*(rdi + = size)= al / ax / eax / rax。它可以用操作数编写,如
STOS byte pointer [RDI]告诉汇编程序要编码的操作数大小版本。但即使在Intel / MASM / NASM语法中,您也可以编写STOSB / STOSW / STOSD / STOSQ

答案 1 :(得分:-1)

在x86中,一个字总是16位:

1 Byte = 8 bits
1 Word = 16 bits = 2 Bytes
1 Dword (long) = 32 bits = 8 Bytes
1 Qword = 64 bits = 16 Bytes

在GDB /实际大小(在32位计算机上):

1 Byte = 8bits
1 Halfword = 16bits = 2 Bytes
1 Word = 32 bits = 4 Bytes
1 Giant (long) = 64 bits = 8 Bytes 
由于16位处理器,英特尔对字大小“搞砸了”。