2011-07-03 68 views
0

這節錄從我的彙編程序大會問題關於使用NASM

First: dw 0xaabbccdd 

現在我意識到,這在邏輯上是不正確的,我希望編譯器定義的話要麼吐出一個錯誤(NASM)或只是創造兩個並排的話。

爲什麼這不會產生錯誤,爲什麼這只是截斷了雙字的前半部分?換句話說,在little endian中,這個打印在內存中的地址是0xdd 0xcc。如果我寫了First: dw 0xccdd,這是有道理的,但不是我寫的。提前致謝 :-)。

+0

有趣的是,我在文檔中找不到任何關於此的內容。 –

+1

這是一個非問題,因爲NASM會向您顯示以下警告: >警告:字數據超出範圍 –

回答

1

彙編器是正確的。 文字值爲32位長,但轉換爲dw將該值截斷爲16位最不重要的位:0xaabbccdd將被截斷爲0xccdd。

Little-endian格式意味着無論值是16位還是32位,該值總是先存儲在LSB中。所以......

  • 0xccdd將被存儲在內存中0xdd 0xcc
  • 0xaabbccdd將被存儲在內存中0xdd 0xcc 0xbb 0xaa

因此,它沒有什麼區別,如果值被截斷 - 前兩個字節在內存中是一樣的。

正如AndréLaszlo指出的那樣,NASM會爲這種情況發出警告。