首页
社区
课程
招聘
[求助]帮我看看这段程序怎么实现得到4位十进制数的每位数字?
发表于: 2010-9-13 12:37 4093

[求助]帮我看看这段程序怎么实现得到4位十进制数的每位数字?

2010-9-13 12:37
4093
请看下面一段程序:内核是SH2的,删除了压栈和参数传递,仅列出算法部分。r6是传入的4位十进制数,不妨设为4321,下面的程序可以实现获得相应位的数字,千位=4,百位=3,十位=2,个位=1。我不明白的是程序中用红色表示的,是3个32位数,用16进制表示。请问这几个红色的数字是什么含义?还有是这个算法如何实现的?(PS:算法我已经在VC2008下调试过,没有问题,最后可以获得各位数字,vc2008的详细程序可见附件!)   
补充说明:extu.w是word扩展,即只留低16位数据,  
dmuls.l r2, r5 是两个32位寄存器相乘,然后高32位存放到mach,低32位存放到macl。
sts  mach, r2 是将mach移动到r2中。
mul.l r2, r3 结果存放到macl中。其他移位指令的应该很明了。不清楚的可以回帖问我。希望高手能看懂这段程序。

这个指令集的源操作数在前,目的操作数在后。即mov     r6, r2是将r6中的内容移动r2中。        

                 mov     r6, r2
                 extu.w  r2, r2
                 mov.l   dword_88A8, r5        ; h'10624DD3
                 dmuls.l r2, r5
                 sts     mach, r2
                 shar    r2
                 shar    r2
                 shar    r2
                 shar    r2
                 shar    r2
                 shar    r2
                 mov     r2, r5
                 rotl    r5              ;
                                         ;
                 mov     #1, r3
                 and     r3, r5
                 mov     r2, r4
                 add     r5, r4
                 mov     r4, r2
                 mov     r2, r7
                 extu.w  r7, r7
                 mov     r7, r0
                 mov.w   r0, @(h'10,r15) ;
                                         ;
                 mov     r6, r2
                 mov     r7, r4
                 mov.w   word_87FE, r12 ; h'3E8 ; d'1000
                 mul.l   r4, r12
                 sts     macl, r4
                 extu.w  r2, r2
                 mov     r2, r5
                 sub     r4, r5
                 mov.l   dword_88AC, r2                        ; h'51EB851F
                 dmuls.l r5, r2
                 sts     mach, r2
                 shar    r2
                 shar    r2
                 shar    r2
                 shar    r2
                 shar    r2
                 mov     r2, r5
                 rotl    r5              ;
                                         ;
                 mov     #1, r3
                 and     r3, r5
                 mov     r2, r4
                 add     r5, r4
                 mov     r4, r5
                 mov     r5, r14
                 mov     r6, r2
                 mov     r7, r4
                 mul.l   r4, r12
                 sts     macl, r5
                 extu.w  r2, r2
                 mov     r2, r4
                 sub     r5, r4
                 extu.w  r14, r14
                 mov     r14, r2
                 mov     #h'64, r3       ; d'100
                 mul.l   r2, r3
                 sts     macl, r2
                 sub     r2, r4
                 mov.l   dword_88B0, r2                   ; h'66666667
                 dmuls.l r4, r2
                 sts     mach, r2
                 shar    r2
                 shar    r2
                 mov     r2, r5
                 rotl    r5
                 mov     #1, r3
                 and     r3, r5
                 mov     r2, r4
                 add     r5, r4
                 mov     r4, r5
                 mov     r5, r0
                 mov.w   r0, @(h'18,r15)
                 mov     r6, r2
                 mov     r7, r6
                 mulu    r6, r12
                 sts     macl, r6
                 sub     r6, r2
                 mov     r14, r6
                 mov     #h'64, r3
                 mulu    r6, r3
                 sts     macl, r6
                 sub     r6, r2
                 mov     r5, r6
                 extu.w  r6, r6
                 mov     r6, r4
                 mov     r6, r12
                 mov     r12, r6
                 shll2   r6
                 shll    r6
                 shll    r4
                 add     r4, r6
                 sub     r6, r2
                 mov     r2, r0
                 mov.w   r0, @(h'1C,r15) ;

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 122
活跃值: (65)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
已经解决了:
h'10624DD3 = 2^38/1000
h'51EB851F = 2^37/100
h'66666667 = 2^34/10
看到这里或许已经猜到这些数字的功能了。我只举第一个数字的含义,其他的类推。用2^38/1000(h'10624DD3的十进制值)乘以一个数后只取高32位意味着要除以2^32,之后又对结果右移6次,相当于除以2^6,这样一共要除 2^38。综合的结果就是直接把开始的操作数除1000。后面的一些操作是针对有符号数,保证正数和负数能得到一样的除以1000的功能,我就不详细说了。
2010-9-17 14:34
0
游客
登录 | 注册 方可回帖
返回
//