金牌会员
 
- 积分
- 1185
- 金钱
- 1185
- 注册时间
- 2015-9-18
- 在线时间
- 422 小时
|
发表于 2016-8-22 09:08:27
|
显示全部楼层
我试了一下,的确运算结果不正确,我把程序贴上(使用的探索者stm32f407zgt6,MDK5)[mw_shl_code=c,true]uint64_t add(uint64_t a, uint64_t b)
{
uint64_t k;
k = a + b;
return k;
}
int main()
{
uint64_t temp;
temp = add(0x000000000000001, 0x000000000000010);
temp = temp+1-1;
}
如下是add()函数的反汇编
[mw_shl_code=asm,true] 41: {
42: uint64_t k;
0x08000226 B5F0 PUSH {r4-r7,lr} ;lr不是链接寄存器嘛,这里为什么要保存lr,而且lr是32位的,为什么需要使用r4~r7???这里请大神指教下
0x08000228 4604 MOV r4,r0 ;r4保存的是第一个形参的低32位(因为r0和r1需要保存和返回函数的运算结果,所以需要将第一个形参部分放入堆栈)
0x0800022A 460D MOV r5,r1 ;r5保存的是第一个形参的高32位
43: k = a + b;
0x0800022C 18A6 ADDS r6,r4,r2 ;将两个形参的低32位相加
0x0800022E EB450703 ADC r7,r5,r3 ;将两个形参的高32位相加(注意,这里使用ADC,也就是带进位的加法)
44: return k;
0x08000232 4630 MOV r0,r6 ;将结果通过r0和r1返回,按道理,这里刚好可以返回64位的整数
0x08000234 4639 MOV r1,r7 ;我认为汇编的实现部分没有问题,不知道为什么结果不正确,请大神指教下~~~
45: } [/mw_shl_code]
|
|