ARM微處理器中支持字節、半字、字三種數據類型,地址的低兩位為0是啥意思?


問題:

  ARM微處理器中支持字節、半字、字三種數據類型,其中,字需要4字節對齊(地址的低兩位為0)、半字需要2字節對齊(地址的最低位為0)。我想問的是括號中的內容是什么意思呢?請牛人幫忙解釋一下!謝謝

百度知道答案:

  1、字對齊數據,也就是說每個數據都是用字(32位)來表示的,而ARM中的存儲單元都是以字節為單位,那么要索引一個數據,需要連續的4個字節才行,比如,0x0000_0000~0x0000_0003這四個單元存儲一個數據,緊接着0x0000_0004~0x0000_0007這四個單元存儲第二個數據,那么依此類推,每個數據的存儲起始地址為:
0x0000_0000
0x0000_0004
0x0000_0008
0x0000_000c
0x0000_0010
0x0000_0014
......
可見,這些數據的地址最后一個十六進制位按照0、4、8、c循環,而對應的二進制為0000、0100、1000、1100。看出來了吧,這些數由於是0x4(0100b)的整數倍,最后兩位都是"00"。
2、同理,半字就是兩個字節,那么地址是:
0x0000_0000
0x0000_0002
0x0000_0004
......
由於都是0x2(10b)的整數倍,所以地址的最后一個二進制位都為"0"。
3、字節類型數據就是每個字節地址都用上了。

 

WORD 是2Bytes還是4bytes?

 

 

1. 對於嵌入式底層人員來說

1 word大小跟cpu結構有關
32位cpu,1word = 4 bytes
64位cpu,1 word = 8 bytes

Half-Word:32位cpu,半字的長度為16位,與8位/16位處理器體系結構中字的長度一致。
字節(Byte):在8位/16位/32位處理器體系結構中,字節的長度均為8位。

在arm920t datasheet中
Two 16KB caches are implemented, one for instructions, the other for data, both with an 8-word line size.
這里8-word 就是32 bytes,不是16bytes

由於arm920t, 緩沖線為32字節,所以在uboot代碼中會看到以下代碼,異常處理是32字節對齊,提高讀取代碼的效率
/*
 * exception handlers
 */
    .align  5
undefined_instruction:
    get_bad_stack
    bad_save_user_regs
    bl    do_undefined_instruction

    .align    5
software_interrupt:
    get_bad_stack
    bad_save_user_regs
    bl    do_software_interrupt

    .align    5
prefetch_abort:
    get_bad_stack
    bad_save_user_regs
    bl    do_prefetch_abort

    .align    5
data_abort:
    get_bad_stack
    bad_save_user_regs
    bl    do_data_abort
2. 對於上層開發人員來說
例如在Visual C++ 6.0中,BYTE與WORD,DWORD本質上都是一種無符號整型,它們在WINDEF.H中被定義,定義如下:

typedef unsigned char       BYTE;
typedef unsigned short      WORD;
typedef unsigned long       DWORD;

 也就是說BYTE是無符號的char型(char型本質上也是一種1個字節的整型),WORD是無符號short型,DWORD是無符號long型。
 而在Visual C++ 6.0中,char型長度為1字節,short型長度為2字節,int和long型長度都為4字節,因此可以認為BYTE與WORD,DWORD定義的變量分別獲得了1字節,2字節,4字節內存。

所以在計算WORD大小時要根據環境決定是2bytes還是4bytes


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM