主题 : 64位整数的处理 复制链接 | 浏览器收藏 | 打印
勿在浮沙筑高台
级别: 新手上路
UID: 35854
精华: 0
发帖: 17
金钱: 85 两
威望: 17 点
贡献值: 0 点
综合积分: 34 分
注册时间: 2011-01-07
最后登录: 2015-05-12
楼主  发表于: 2011-10-27 10:38

 64位整数的处理

64位整数的除法中有这样的写法,如下
#define do_div(n,base)                        \
({                                \
    register unsigned int __base      asm("r4") = base;    \
    register unsigned long long __n   asm("r0") = n;    \
    register unsigned long long __res asm("r2");        \
    register unsigned int __rem       asm(__xh);        \
    asm(    __asmeq("%0", __xh)                \
        __asmeq("%1", "r2")                \
        __asmeq("%2", "r0")                \
        __asmeq("%3", "r4")                \
        "bl    __do_div64"                \
        : "=r" (__rem), "=r" (__res)            \
        : "r" (__n), "r" (__base)            \
        : "ip", "lr", "cc");                \
    n = __res;                        \
    __rem;                            \
})
其中n是64位整数,register unsigned long long __n   asm("r0") = n;    这样赋值之后,n的低32位存到了r0中,高32位就存到r1了,这段代码我在mini2440的开发板上调试过,为什么高32位会存到r1里?
疯狂的嵌入式爱好者
级别: 论坛版主
UID: 40543
精华: 1
发帖: 169
金钱: 920 两
威望: 184 点
贡献值: 1 点
综合积分: 358 分
注册时间: 2011-03-19
最后登录: 2013-05-10
1楼  发表于: 2011-10-27 11:36
这个有点类似Endian(字节序?端?)规则.而在2440跟6410上使用的是Little Endian的方式。如果你学过x86汇编,也是一样的。
请参考百度百科上的Endian介绍.
http://baike.baidu.com/view/633653.htm
别人转角遇见爱,我转角遇见猫T _T .
勿在浮沙筑高台
级别: 新手上路
UID: 35854
精华: 0
发帖: 17
金钱: 85 两
威望: 17 点
贡献值: 0 点
综合积分: 34 分
注册时间: 2011-01-07
最后登录: 2015-05-12
2楼  发表于: 2011-10-27 11:56
这个我明白但是现在使用的是寄存器,也是这个道理吗?寄存器应该没有地址的概念