zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    6.1.1.1 属性类型之数据属性
    6.1 理解对象
    5.7.2.4 random() 方法
    5.7.2.3 舍入方法
    5.7.2.2 min()和max()方法
    5.7.2.1 Math对象
    5.7.1.4 window对象
    frontend2_s9_part2_fe_d48_form
    s10_part3_django_basic.md
    frontend1_s9_part2_d47_html
  • 原文地址:https://www.cnblogs.com/lemaden/p/10431181.html
Copyright © 2011-2022 走看看