汇编语言除法公式溢出问题

汇编语言 除法公式溢出问题

当且仅当 H(高16位) ≤ ( n - 1 ) 时 才不会溢出 即
( H * 65536 ) / n + L / n ≤ 65535( 商) + ( n - 1 ) 余数 0FFFFH = 65536
通俗的讲就是高16位不能大于等于除数
=》 (n-1) * 65536 / n + L/n ≤ 65534 + n
=》 (n-1) * 65536 + L ≤ 65534 n + n * n
=》 65536n - 65536 + L ≤ 65534 n + n * n
=》 L ≤ n * n - 2n + 65536
=》 L ≤ n * n - 2n + 1 + 65535
=》 L ≤ (n-1)*(n-1) + 65535
L 为低16位 所以 L ≤ 65535 所以上式一定成立

反向证明 当高16位大于除数n时必然会溢出
( (dx) * 65536 +(ax) ) / n ≥ (dx) * 65536 / n + ax / n
= (dx) / n * 65536 + ax / n
≥ 1 * 65536
> 65535 = FFFF 所以必然溢出

所以可以用除以两次的方法来解决除法溢出问题
第一次
mov dx,0
mov ax,H ;H为高16位
mov cx,n
div cx ;ax中存商,dx存余数,余数必然是小于n,所以再次使用除法指令一定不会溢出(上面以证明了)

第二次
mov bx,ax ;将第一次的商放到bx中,第一的商也就是最总结果的高16位
mov ax,L ;L为低16位
div n ;这时候dx中数值为第一除法的余数且小于n,ax存商,dx存余数
mov cx,dx ;余数放到cx中
mov dx,bx ;第一次的高16位放到dx中

-----最终结果 dx存商的高16位 ax存商的低16位 cx存余数

汇编语言中,处理小数除法并输出结果通常涉及到浮点数运算,这在不同的架构和指令集中可能会有所不同。例如,在x86架构(如Intel或AMD)上,你可以使用FPU(浮点单元)进行这些操作,而在ARM或者RISC-V等平台上可能有不同的方法。 对于小数除法,首先你需要将被除数和除数转换为适合浮点计算的数据类型,如xmm或dpf registers(取决于使用的指令集)。然后,你可以调用浮点除法指令,比如`fld`(加载浮点数)和`fdiv`(浮点除法),来得到商。最后,为了将结果输出到屏幕,你通常需要将浮点值转换回整数或字符形式,并通过内存操作或系统调用来显示。 以下是一个简化的示例,假设使用x86 SSE指令集: ```assembly ; 假设我们有寄存器eax存放被除数,ebx存放除数 ; 首先,加载到xmm0 fld qword [eax] fld qword [ebx] ; 使用fdiv指令除以 fdiv ; 商的结果保存在xmm0,但通常需要转换和格式化 ; 这部分可能会用到movss (move single-precision) 和 printf 或者类似系统的接口 ; 示例(不完整,仅示意): ; movss xmm1, xmm0 ; 把单精度浮点数转换到xmm1 ; lea edi, [output_buffer] ; 指向输出缓冲区 ; vfprintf(stdout, "%f", xmm1) ; 使用系统调用,传入格式字符串和xmm1 output_buffer: ; 假设这是用于输出的内存区域 ``` 请注意,实际代码会更复杂,因为它需要处理溢出、异常处理以及可能的浮点精度问题。此外,不同的操作系统和编译器可能提供不同的工具库来支持浮点运算和输出。在使用时,请查阅具体的汇编语言参考文档或使用相应平台的API文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值