2015-09-13 101 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