2015-04-12 37 views
1

我需要從兩個little endian內核(例如arm)讀取/寫入設備寄存器(在我的情況下是大端地址空間)。我不想使用中間端轉換例程(例如htonl)。我的理解是現代內核有指令,可以直接對大端內存進行讀/寫操作。gcc是否提供內建讀取大端內存?

gcc是否爲上述內容提供了自動生成正確彙編指令的內建函數?

+0

當涉及到排序時,ARM通常是可配置的,但傳統上是* big * endian。 x86系列是小端的。如果有特殊的彙編程序指令,那麼您必須確定*關於CPU體系結構,因爲這些指令在體系結構之間可能有很大差異。 –

+1

至於如果GCC支持任何endian轉換的內在函數,請閱讀[在線手冊](https://gcc.gnu.org/onlinedocs/)。 –

回答

4

有從GCC 4.3.0內置功能:

  1. 內置功能:int32_t __builtin_bswap32(int32_t X),它將返回顛倒輪空的順序。例如。 11223344將是0x44332211
  2. 內置函數:int64_t __builtin_bswap64(int64_t x) 也類似於__builtin_bswap32,除了它返回64位。

請參考Beware the builtins

+0

使用__builtin_bswap32在從大端設備寄存器加載寄存器之後將花費額外的指令來進行字節交換。我正在尋找一些機制,它可以直接生成適當的cpu指令從大端存儲器加載並存儲在本地寄存器中(主機端序列)。 –

+2

@VakulGarg:哪個CPU指令做到這一點?如果沒有CPU指令來執行它,則不能使用不存在的指令。如果它確實存在,你可以使用'asm'或其他任何方法來訪問指令。 –