2015-09-13 73 views
0
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位操作系统上使用虚拟机。奇怪的数据大小?

我在做什么错?

这是否意味着在OS中我的虚拟机上运行的大小为:

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 

回答

-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位处理器,英特尔“干扰了”字大小。

+1

请参阅Peter Cordes的答案。使用Halfword的“GDB”列表对于Intel和Compatible来说没有任何意义。因此,如果您有16位,32位或64位处理器,则无关紧要。英特尔没有“搞砸”。我想你是在想机器的话。这些在这里没有作用。 BYTE,WORD等具有固定的含义和大小。 –

+0

是的,你是对的我认为一个32位的PC应该有一个32位的单词(读下面的引号)。我所说的“搞砸”是因为他们选择了16位,所以它与一些旧处理器兼容,但我想我错了。谢谢。 “处理器中的大多数寄存器通常是字大小的,在单个操作中可以在工作存储器中传输的最大数据量是许多(不是全部)架构中的一个字。” - 在维基百科关于词 – SadSeven

+0

ISTM你正在混淆“机器词”与WORD类型。 –

1

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

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

对于x86,单词原本是16位。 (我想x86的8位只有祖先没有使用术语“单词”,因为他们可以只说“字节”)。当x86扩展为32位模式(i386)时,不会重新命名所有内容。

字节是总是八位字节的8位,除了在一些历史的计算机体系结构。有一些9位字节。 C标准仍然不需要CHAR_BIT = 8,因此为了编写完全可移植的代码,您不能假定或2的补码有符号整数。

86文档和asm助记符/语法

所以:

  • B =字节= 8位(在载体PADDB附加填充的8位整数)
  • W =字= 16位(PADDW附加包装16位整数中载体)
  • d =长或双字(双字)= 32位(在载体中加载PADDD 32位打包整数)
  • Q =四字= 64位(PADDQ附加包装的64位整数在载体中)
  • DQ =双 - 四(有时也是八字)= 128b(movdqa复制对齐128b。 PUNPCKLQDQ:交织大号流2组的64位Q词语128B src和dest的进入DQ目标寄存器)

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

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

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