Bli*_*ndy 36
同样,32位算法也适用于16位系统.
在这种情况下,它使用2个32位内存地址一起形成64位数字.加法/减法很容易,你可以按部分进行,唯一的问题就是从下部到较高部分进行结转.对于乘法/除法,它更难(即更多指令).
它显然很慢,比乘法的32位算术慢一点,但如果你需要它,那就适合你.当您升级到64位处理器编译器时,它会自动优化为具有更大字长的一条指令.
在发布模式下编译的32位处理器上的64位乘法的Visual Studio 2010 Professional实现是:
_allmul PROC NEAR
A EQU [esp + 4] ; stack address of a
B EQU [esp + 12] ; stack address of b
mov eax,HIWORD(A)
mov ecx,HIWORD(B)
or ecx,eax ;test for both hiwords zero.
mov ecx,LOWORD(B)
jnz short hard ;both are zero, just mult ALO and BLO
mov eax,LOWORD(A)
mul ecx
ret 16 ; callee restores the stack
hard:
push ebx
A2 EQU [esp + 8] ; stack address of a
B2 EQU [esp + 16] ; stack address of b
mul ecx ;eax has AHI, ecx has BLO, so AHI * BLO
mov ebx,eax ;save result
mov eax,LOWORD(A2)
mul dword ptr HIWORD(B2) ;ALO * BHI
add ebx,eax ;ebx = ((ALO * BHI) + (AHI * BLO))
mov eax,LOWORD(A2) ;ecx = BLO
mul ecx ;so edx:eax = ALO*BLO
add edx,ebx ;now edx has all the LO*HI stuff
pop ebx
ret 16 ; callee restores the stack
Run Code Online (Sandbox Code Playgroud)
如您所见,它比正常乘法慢很多.
为什么你觉得它令人惊讶?没有什么可以阻止编译器在32位机器上支持64位,128位或更多位的整数类型.如果感觉像编译器,编译器甚至可以支持57位和91位类型.实际上,在N位机器上支持2N位整数运算是一项相对容易的任务,因为典型机器的指令集通常在设计时考虑到这种功能.
小智 5
32位只是一个机器字的本机大小,意味着它们可以一次处理,并不意味着更大的项目不能处理,它们只需要作为单独的32位单元多次处理步,以同样的方式,它们可以小于一个机器字,在这种情况下,只会处理整个机器字的一部分。
| 归档时间: |
|
| 查看次数: |
16401 次 |
| 最近记录: |