2010-12-21 29 views
5

我需要幫助理解x86處理器的CPU寄存器內部的字節順序。我寫這個小彙編程序:CPU寄存器內的字節序編號

section .data 
section .bss 

section .text 
    global _start 
_start: 
    nop 
    mov eax, 0x78FF5ABC 
    mov ebx,'WXYZ' 
    nop ; GDB breakpoint here. 
    mov eax, 1 
    mov ebx, 0 
    int 0x80 

我在GDB運行此程序與行號10(在上面的源註釋)斷點。在此斷點處,info registers顯示的值爲eax=0x78ff5abcebx=0x5a595857。由於W,X,Y,Z的ASCII碼分別爲57,58,59,5A,因此,而intel是小端,0x5a595857似乎是正確的字節順序(最低有效字節在前)。那麼爲什麼不是eax寄存器0xbc5aff78(數字0x78ff5abc的最低有效字節)的輸出而不是0x78ff5abc

回答

5

字節序纔有用內存,每個字節有數字地址。當一個值的MSByte被放在比LSByte更高的內存地址中時,它被稱爲Littte endian,這是任何x86處理器的字節序。

雖然整數低字節和高字節之間的區別是顯而易見的:

0x12345678 
MSB---^^ ^^---LSB 

它不是字符串常量定義!這不是很明顯應該被認爲是什麼WXYZ的一部分低位或高位:

1)最明顯的方法,

'WXYZ' -> 0x5758595A 

會導致內存順序ZYXW

2)不是不那麼明顯的方式,當內存順序應與文字的順序:

'WXYZ' -> 0x5A595857 

彙編器必須選擇其中的一個,顯然它選擇第二個。

14

寄存器內部的字節順序是沒有意義的,因爲字節順序是描述字節順序是從低到高存儲器地址還是從高到低存儲器地址。寄存器不是字節可尋址的,因此寄存器內沒有低位或高位地址。你所看到的是你的調試器如何打印出數據。

+0

謝謝你的回覆。顯然'WXYZ'確實是以相反的順序存儲在ebx寄存器中的。根據調試器,BL寄存器包含87(十進制值0x57);當然,這裏有一個字節順序的概念?爲什麼'W'不是存儲在ebx的最高8位? – wrxyz 2010-12-22 00:01:43

+3

實際上,寄存器*是*部分字節尋址的。您可以使用AL和AH訪問EAX的較低兩個字節。 – 2010-12-22 00:46:57

9

彙編程序以不同的方式處理這兩個常量。在內部,EAX寄存器中的值以big-endian格式存儲。你可以看到,通過文字:

mov eax, 1 

如果你查閱登記冊,你會發現它的價值是0x00000001

當你告訴彙編器你想要恆定值0x78ff5abc時,這正是存儲在寄存器中的東西。 EAX的高8位將包含0x78,並且AL寄存器包含0xbc

現在如果您將存儲爲 EAX中的值存入內存,它將以相反的順序排列在內存中。也就是說,如果你寫:

mov [addr],eax 

然後在[地址],你會看到0xbc,0x5a檢查內存,爲0xFF,0x78。

在'WXYZ'的情況下,彙編程序假定您要加載的值如果要寫入內存,它將被佈置爲0x57,0x58,0x59,0x5a。

看看彙編器生成的代碼字節,你會看到不同之處。在mov eax,0x78ff5abc的情況下,你會看到:

<opcodes for mov eax>, 0xbc, 0x5a, 0xff, 0x78 

mov eax,WXYZ的情況下,你會看到:

<opcodes for mov eax>, 0x57, 0x58, 0x59, 0x5a 
相關問題