zoukankan      html  css  js  c++  java
  • 大端和小端

    2.1.101. --littleend
    此选项指示编译器使用小端内存为 ARM 处理器生成代码。
    在小端内存中,字的最低有效字节具有最低地址。
    缺省设置
    除非显式指定 --bigend,否则编译器将采用 --littleend。
    
    2.1.14. --bigend
    此选项指示编译器使用大端内存为 ARM 处理器生成代码。
    ARM 体系结构定义以下两种不同的大端模式:
    BE8
    字节固定寻址模式(ARMv6 及更高版本)。
    BE32
    旧大端模式。
    在链接时指定是选择 BE8 还是 BE32。
    缺省设置
    除非显式指定 --bigend,否则编译器将采用 --littleend。
    
    2.1.5. --be8
    此选项指定 ARMv6 字节固定寻址大端模式。
    这是 ARMv6 大端映像的缺省字节寻址模式,意味着链接器反转指令的端标记,
    提供已按大端模式编译/汇编的输入对象的小端代码和大端数据。
    字节固定寻址模式只在支持 ARMv6 和更高版本的 ARM 处理器上可用。
    
    2.1.6. --be32
    此选项指定旧的字固定寻址大端模式,即与 ARMv6 之前的大端映像相同。 
    这会生成大端代码和数据。
    字固定寻址模式是所有 ARMv6 之前的大端映像的缺省模式。
    
    
    ARM1156T2-S Technical Reference Manual  Revision: r0p4
    
    Differences between BE-32 and BE-8 buses
    
    6.5.1. Differences between BE-32 and BE-8 buses
    
    The differences between handling Word-Invariant, or BE-32, 
    and Byte-Invariant, or BE-8, data buses are:
    
    In a BE-32, Word-Invariant, system, 
    the representation of a 32-bit Word access is the same 
    between a BE-32 access and a LE access to the same word address. 
    
    However, the representation of the byte (and half-word) accesses on the bus is different.
    
    In a BE-8, 
    
    Byte Invariant, system the representation of a byte access is the same 
    between a BE-8 access and a LE access to the same byte address. 
    
    However, the representation of the word (and half-word) accesses on the bus is different.
    
    In BE-32 and BE-8 implementations of big-endian access, 
    the lowest byte address corresponds to the most significant byte
    
    Table 6.4 shows:
    
    the effect of LE, BE-8 and BE-32 accesses on a 64 bit wide bus.
    the basic form that for Byte accesses, LE and BE-8 columns are the same, 
    and for Word accesses LE and BE-32 columns are the same.
    
    Note
    
    In both the BE-8 and the BE-32 cases, 
    the byte access to address 0 (the lowest address) corresponds 
    to the most significant byte of the word access, 
    so fitting the big-endian description.
    
    
    Table 6.4. Byte lanes used for LE, BE-8 and BE-32 accesses
    
    ------------+-------+--------+--------+---------+----------+----------+---------
    DataBusPins |  Byte Accesses |      Halfword Accesses      | Word Accesses
    ------------+-------+--------+--------+---------+----------+----------+---------
                |  BE-8 |        |                             | BE-32    |  
    ------------+-------+--------+--------+---------+----------+----------+---------
                |  LE   | BE-32  |  LE    |  BE-8   |  BE-32   | LE       |  BE-8   
    ------------+-------+--------+--------+---------+----------+----------+---------
    63:56       |  A7   | A4     |  A6:MS |  A6:LS  |  A4:MS   | A4:MS    |  A4:LS  
    55:48       |  A6   | A5     |  A6:LS |  A6:MS  |  A4:LS   | A4:MS-1  |  A4:LS+1  
    47:40       |  A5   | A6     |  A4:MS |  A4:LS  |  A6:MS   | A4:LS+1  |  A4:MS-1  
    39:32       |  A4   | A7     |  A4:LS |  A4:MS  |  A6:LS   | A4:LS    |  A4:MS  
    ------------+-------+--------+--------+---------+----------+----------+---------
    31:24       |  A3   | A0     |  A2:MS |  A2:LS  |  A0:MS   | A0:MS    |  A0:LS  
    23:16       |  A2   | A1     |  A2:LS |  A2:MS  |  A0:LS   | A0:MS-1  |  A0:LS+1  
    15:8        |  A1   | A2     |  A0:MS |  A0:LS  |  A2:MS   | A0:LS+1  |  A0:MS-1  
    7:0         |  A0   | A3     |  A0:LS |  A0:MS  |  A2:LS   | A0:LS    |  A0:MS  
    ------------+-------+--------+--------+---------+----------+----------+---------
    
    A<Num>          Byte access to address[2:0] = Num
    A<Num>:<Byte>   Byte <Byte> of Word/Half-word access to address[2:0]=Num
            MS      Most significant byte
            MS-1    Second most significant byte
            LS+1    Second least significant byte
            LS      Least significant byte
    
    
    ARM7TDMI Technical Reference Manual Revision: r4p1
    Home > Programmer’s Model > Memory formats
    2.3. Memory formats
    The ARM7TDMI processor views memory as a linear collection of bytes numbered 
    in ascending order from zero. For example:
    
    bytes zero to three hold the first stored word
    bytes four to seven hold the second stored word.
    
    The ARM7TDMI processor is bi-endian and can treat words in memory 
    as being stored in either:
    Little-endian.
    Big-endian
    
    Note
    Little-endian is traditionally the default format for ARM processors.
    
    The endian format of a CPU dictates where the most significant byte 
    or digits must be placed in a word. 
    
    Because numbers are calculated by the CPU starting with the least significant digits, 
    little-endian numbers are already set up for the processing order.
    
    Endian configuration has no relevance unless data is stored as words and 
    then accessed in smaller sized quantities (halfwords or bytes).
    
    2.3.1. Little-endian
    In little-endian format, 
    
    the lowest addressed byte in a word is considered the least-significant byte of the word 
    and the highest addressed byte is the most significant. 
    
    So the byte at address 0 of the memory system connects to data lines 7 through 0.
    
    For a word-aligned address A, Figure 2.1 shows how 
    
    the word at address A, 
    the halfword at addresses A and A+2, 
    and the bytes at addresses A, A+1, A+2, and A+3 
    
    map on to each other when the core is configured as little-endian.
    
    2.3.2. Big-endian
    
    In big-endian format, the ARM7TDMI processor stores 
    
    the most significant byte of a word at the lowest-numbered byte, 
    and the least significant byte at the highest-numbered byte. 
    
    So the byte at address 0 of the memory system connects to data lines 31 through 24.
    For a word-aligned address A, Figure 2.2 shows how 
    
    the word at address A, 
    the halfword at addresses A and A+2, 
    and the bytes at addresses A, A+1, A+2, and A+3 
    
    map on to each other when the core is configured as big-endian.
    
    
    IAR C/C++ Compiler and Assembler.
    
    Target options 
    
    The Target options specify target-specific features for the IAR C/C++ Compiler and Assembler.
    
    Endian mode 
    Selects the byte order for your project:
     
    Little 
    
    The lowest byte is stored at the lowest address in memory. 
    The highest byte is the most significant; it is stored at the highest address. 
    
    Big 
    
    The lowest address holds the most significant byte, 
    while the highest address holds the least significant byte. 
    
    Choose between two variants of the big-endian mode:
    
    BE8 to make data big-endian and code little-endian
    BE32 to make both data and code big-endian. 
    
    
    
    http://sd-10807.dedibox.fr/show_items-feed=01a46856a67ba7423eaf4165276e1845
    
    
    ARM11 BE8 and BE32    
    
    Date: Thursday, 08 Apr 2010 02:21
    
    What’s difference between BE8 and BE32?
    
    BE-32 is supported by ARM cores up to the ARM11 family (v6) 
    (for example ARM7TDMI, ARM926EJ-S, ARM1136JF-S). 
    It is enabled by setting a bit in the CP15 system control coprocessor.
    
    BE-8 is supported by the ARM11 family and later 
    (for example ARM1136JF-S, Cortex-R4, Cortex-A8). 
    Architecture v7 cores do not support BE-32.
    
    It is controlled by setting a bit in the CPSR.
    
    Setting both bits is reserved (not a valid configuration).
    
    In terms of data access:
    
    BE-8 is byte invariant endianness
    BE-32 is word invariant endianness
    
    This is easiest to see with examples. 
    I’ve starred **** the important ones:
    
    Basic endianness:
    
    Consider a word stored 0x11223344 where "11" is the most significant byte.
    
    Little endian:                Big endian:     
                    
    Address 0   1   2   3         Address 0   1   2   3 
    Data    44  33  22  11        Data    11  22  33  44
                    
    BE-32 and BE-8
    
    //------------------------------------------------------------------------------
    Now consider data stored like this:
    //------------------------------------------------------------------------------
    
    Address 0   1   2   3 
    Data    11  22  33  44
    
    //------------------------------------------------------------------------------
    // Core in little-endian
    //------------------------------------------------------------------------------
    Core in little-endian mode makes word access to address 0:
    
    LDR r0, [0]
    r0 contains 0x44332211
    Data loaded to register as little endian
    
    //------------------------------------------------------------------------------
    Core in little-endian mode makes byte access to address 0:
    LDRB r0, [0]
    r0 contains 0x00000011
    Data loaded from 0
    
    //------------------------------------------------------------------------------
    Core in little-endian mode makes byte access to address 3:
    LDRB r0, [3]
    r0 contains 0x00000044
    Data loaded from 3
    
    //------------------------------------------------------------------------------
    // Core in BE-32
    //------------------------------------------------------------------------------
    Core in BE-32 mode makes word access to address 0:
    LDR r0, [0]
    r0 contains 0x44332211
    Word accesses are endianness-invariant
    
    //------------------------------------------------------------------------------
    ****Core in BE-32 mode makes word access to address 0:
    LDRB r0, [0]
    r0 contains 0x00000044
    Byte access in BE-32 reads the word as if it was stored big-endian
      
    //------------------------------------------------------------------------------
    Core in BE-32 mode makes word access to address 3:
    LDRB r0, [1]
    r0 contains 0x00000011
    As above
    
    //------------------------------------------------------------------------------
    // Core in BE-8
    //------------------------------------------------------------------------------
    ****Core in BE-8 mode makes word access to address 0:
    LDR r0, [0]
    r0 contains 0x11223344
    Data loaded to register as big endian
    
    //------------------------------------------------------------------------------
    Core in BE-8 mode makes byte access to address 0:
    LDRB r0, [0]
    r0 contains 0x00000011
    Byte at address 0 is loaded, NOT the byte at address 3
    
    //------------------------------------------------------------------------------
    Core in BE-8 mode makes byte access to address 3:
    LDRB r0, [3]
    r0 contains 0x00000044
    Byte at address 3 is loaded.
    
    Essentially BE-32 operates by altering the addresses of memory accesses 
    when accessing subword quantities. This gives the appearances of big endian.
    
    //------------------------------------------------------------------------------
    // Word Invariant/ Byte Invariant
    //------------------------------------------------------------------------------
    
    什么是word invariant ?
    就是按word去访问时,数据总线上的对应的存储区域的地址是一一对应的;
    
    什么是byte invariant ?
    就是按byte去访问时,数据总线上的对应的存储区域的地址是一一对应的;


  • 相关阅读:
    KindEditor的使用
    python过滤文件中特殊标签
    django中orm的简单操作
    django中models联合唯一unique_together
    博客当中的文章分类以及归档
    zabbix前端添加平台脚本监控
    django重写form表单中的局部钩子函数
    input获取、失去焦点对输入内容做验证
    django admin后台的简单使用
    django中博客后台将图片上传作为用户头像
  • 原文地址:https://www.cnblogs.com/shangdawei/p/2811629.html
Copyright © 2011-2022 走看看