2013-11-25 61 views
1

.word(和其他)命令是否改變字節順序?Little-endian和彙編命令

例如:

.byte 0xA 
.byte 0xB 

我應該使用.word 0xAB.word 0xBA

+3

字狀指令會照顧你的字節序,但2字節0xA和0xB不會導致0xAB或0xBA值,而是0xB0A或0xA0B – Artur

+0

低位地址 - > MSB,高位地址 - > LSB =低位末位 – Sam

+0

低位地址 - > LSB,高位地址 - > MSB =大端位 – Sam

回答

1

從人的角度來看 - 如果你寫(例如在紙上)一個十六進制數 - 比如0xABCD - 這意味着你用位置系統表示一些值,基數爲16.現在你的思想不應該擔心endianess在所有。使用十六進制時,您總是會將此數字寫爲0xABCD,並且您的數字(A,B ..)必須始終寫在相同的位置以保持相同的值。

寫在紙上的數量不超過在任何彙編或C/C寫它太大的不同++,JAVA ....

例如 - 十六進制數0xABCD在一些語言:

的Java:

short s = 0xABCD; 

C/C++:

short s = 0xABCD; 

MASM/TASM

s DW ABCDh 

不管所使用的語言的 - 所有上述用途0xABCD其中,如果考慮無符號的值必須被理解爲(A * 4096 + B * 256 + C * 16 + d = 43981即。 A是MSB,D是LSB)。

如果你在字節級別工作,你可能會開始擔心endianess。正如你所看到的,我沒有談到如何在Java,C,C++,MASM和TASM中存儲0xABCD值。你使用你的號碼,就像你在紙上做的那樣,雖然它不存在字節度,但在字節級上,它可能是小端或大端,具體取決於你的機器,網絡接口等,雖然在你的程序中這仍然是0xABCD。

在你的情況下,如果你在'word'/'short'抽象層次上工作 - 不要擔心endianess。

更新:

如果要使用「byte'類指令這將取決於你的機器字節序(或網絡字節順序)來存儲0x0A0B值。假設你想把它存儲在內存中。

在小端機(X86爲例),你應該做的:

.byte 0xB 
.byte 0xA 

在大端機器,你應該做的:

.byte 0xA 
.byte 0xB 
+0

很好的答案,除了你,我會爲你+1沒有真正回答他的問題。如果他在內存中有字節序列「0xa,0xb」,並且他想將該序列聲明爲一個字,他必須考慮字節序,並且必須知道主機如何存儲該字以匹配字節序列。 –

+0

@CareyGregory:他的兩個問題都沒有意義,因此很難準確回答。首先** .word(和其他)命令是否改變字節順序?**這個問題本身是不正確的,除非他想問使用.word是否將0xA0B存儲爲0xA,0xB等等,第二**我應該使用.word 0xAB或.word 0xBA?**它依賴於他需要的數字;-) – Artur

+0

我認爲他的問題是如何使用'.word'聲明覆制字節序列'0xa,0xb'。但我同意這個問題的寫作很差。 –

1

Endian-ness只描述字節存儲的順序。當你將存儲的字節看作單詞,雙字等時,它們總是以最重要的字節顯示。所以,在你的例子,如果你沒有

.word 0x0A0B 

小端系統將這些字節存儲爲0B 0A。大端系統會將字節存儲爲0A 0B。但是,如果您將字節視爲單詞,則始終是0x0A0B,無論它們是如何存儲的。

在你上面的例子,如果你想放下用little endian系統中的兩個輪空,你希望確保他們在爲了0A 0B(例如,這就是你希望它們存儲在內存中)你應該使用

.byte 0xA 
.byte 0xB 

.word 0x0B0A 

然而,這是奇怪的是,你會用字節順序這樣的擔心。通常,如果你正在定義單詞,那是因爲你想要稍後(作爲單詞)檢索內存來執行操作,因此它們存儲的方式(字節順序)應該不重要。