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
答案 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助记符/语法中:
PADDB
在向量中添加8位整数)PADDW
在向量中添加16位整数)PADDD
在向量中添加32位整数)PADDQ
在向量中添加64位整数)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位处理器,英特尔对字大小“搞砸了”。