首页
社区
课程
招聘
[Win32汇编]一个64位除以1024的算法的原理求教
发表于: 2015-2-8 19:59 5209

[Win32汇编]一个64位除以1024的算法的原理求教

2015-2-8 19:59
5209
_Div1024 proc   uses esi edi    _lowDWORD:DWORD, _highDWORD:DWORD
        mov esi, _lowDWORD
        mov edi, _highDWORD
        mov eax, DWORD ptr [esi]
        mov edx, DWORD ptr [edi]
        shr eax, 10
        mov ecx, edx
        shl ecx, 22
        or eax, ecx
        mov DWORD ptr [esi], eax
        shr edx, 10
        mov DWORD ptr [edi], edx
        
        xor eax, eax
        
        ret
_Div1024 endp

上面函数是一个对于64位数的除1024的运算,
传入的参数分别是低32位数和高32位数。
我大概能看懂它处理的逻辑 :
先讲低32位进行逻辑右偏移10位(也就是相当于除以2的10次方1024)
然后讲高32进行逻辑左偏移32-10=22位
再把左偏移过后的高32位和第一步进行or相与,也就是结合到了一起作为返回结果的低32位
然后对原高32位进行右偏移10位 作为返回结果的高32位

小弟不才实在是想不透其中的奥妙
有高手能形象一点的剖析一下定感激不尽!

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 398
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
你自己都说了,64位除以1024,相当于除以2的10次方,所以就相当于把这64位的数整体右移10位就是结果;
先将低32位右移10位,然后将高32位右移10位,只是高32位右移10后,移出来的10位要放到低32位的高端呀,
2015-2-8 20:12
0
雪    币: 19
活跃值: (74)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
shr eax, 10
        mov ecx, edx
        shl ecx, 22
        or eax, ecx

楼上说得对,这些代码就是:把高32位的低10位放到低32位的高10位上面。左移右移好像在masm中都是补0的,所以or执行正好就是高32位的低10位与0或,低32位的低22位与0或,结果显然是高32位的低10位和低32位的低22位。
2015-2-9 19:04
0
雪    币: 123
活跃值: (60)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
;SHL、SAL: 每位左移, 低位补 0, 高位进 CF
;SHR? : 每位右移, 低位进 CF, 高位补 0
;SAR? : 每位右移, 低位进 CF, 高位不变,(在每次右移时,保持最高位(符号位)不变,最低位右移至CF中)


一个大数24338148010
EDX 00000000000000000000000000000101
EAX 10101010101010101010101010101010
shr eax, 10
EAX 00000000001010101010101010101010
mov ecx, edx
ECX 00000000000000000000000000000101
shl ecx, 22
ECX 00000001010000000000000000000000
or eax, ecx
EAX 00000001011010101010101010101010 = 23767722
24338148010 /1024 = 23767722
shr edx, 10
EDX 0
把 edx加在eax 前面 组成新的数,自己不清楚的时候,画个图就行了。
2015-2-9 19:55
0
雪    币: 276
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
>当于把这64位的数整体右移10位就是结果
看到这句才是关键啊。
再加上我之前把高低方向搞错了(错误的理解是从左到右当成低高了)
才搞糊涂了啊。
多谢!
2015-2-10 23:15
0
游客
登录 | 注册 方可回帖
返回
//