2011-03-14 151 views
0

假設你正在爲不同的體系結構編寫編譯器。 架構有不同的排列順序。 您有存儲器讀寫指令二進制翻譯|交叉編譯

舉一個存儲指令的例子,您要存儲值0xAA0xBB0xCC0xDD。 現在在爲此編寫程序集時,是否爲 不同的體系結構編寫了兩個不同的指令,例如:

對於小尾數:st (reg), 0xDD0xCC0xBB0xAA

對於大端:st (reg), 0xAA0xBB0xCC0xDD

或者你寫相同的指令,也就是說,st, (reg), 0xAA0xBB0xCC0xDD兩者的架構,讓指令由處理器,使得它被解析照顧系統的排序?

我問這個問題的原因是我不知道二進制翻譯器在不同的字節順序架構之間翻譯代碼時會做什麼。如果在體系結構A中,您會看到以下行st,(reg),XY是否將它轉換爲體系結構B的st,(reg),YX?如果是這樣的話,那麼內存讀取會發生什麼?

我想知道如何照顧字節順序,考慮二進制翻譯中的內存讀取和寫入。

回答

1

我不確定我完全理解你的問題,但它聽起來像你想翻譯一些彙編語言代碼或反彙編二進制文件?

我曾經合作過的每個彙編程序都以合理的方式處理常量的字節順序。也就是說,如果你想存儲0xAABBCCDD,你可以這樣寫:

st (reg), 0xAABBCCDD 

並在必要時進行適當的操作碼彙編器調酒的contstant。在endianness成爲關注點的地方,就是您想要使用該操作存儲多個單字節值的位置。類似於使用相同的操作碼向存儲器寫入短空終止字符串"123"。你必須調酒是不斷在你的彙編代碼得到它輸出到存儲在little-與大端系統的正確順序:

st (reg), 0x31323300 // big-endian 
st (reg), 0x00333231 // little-endian 

的安全的方法是隻存儲在順序字節您想要他們:

stb (reg+0), 0x31 
stb (reg+1), 0x32 
stb (reg+2), 0x33 
stb (reg+3), 0x00 

但是,這需要四條指令,而不是。

+0

接下來的問題是,如何通過查看程序集模塊來區分常量和空終止字符串? – n0nChun 2011-03-14 18:45:00

+0

@ nnnChun,我很確定這是不可能的,或者至少是困難的。這幾乎相當於閱讀程序員的思想。 – 2011-03-14 20:37:28

2

Endianess與內存如何被讀取或寫入無關,而是它意味着當內存被解釋爲一個數字時,是最重要的字節首先還是最後一個。只有算術的實現纔會有所不同。

所以你的二進制翻譯器,如果這樣的東西存在,不會改變任何東西,它只是像ADD,SUB和MUL這樣的指令,它們對數字的解釋是不同的。