关于实验10(2)
本帖最后由 laocaiye 于 2025-3-3 14:56 编辑关于实验10(2),思路与小鱼有所不同,在原ax,dx,cx基础上只需借用bx,即可完成功能。代码如下,供参考。
assume cs:code
code segment
start: mov ax,4240h;被除数低位
mov dx,000fh;被除数高位
mov cx,0ah;除数
call divdw
mov ax,4c00h
int 21h
divdw: push bx;下面的过程要借用bx存储,所以先把当前bx值入栈。
mov bx,ax;由于下一步计算需要用到ax,所以先把ax当前值保存到bx
mov ax,dx;把被除数高位赋给ax,作为高位除法的低16位
mov dx,0;把dx置为0,作为高位除法的高16位。即先把000fh作为被除数
div cx;除法结果:ax此时存储的是高位除法的商,dx存储的是余数
push ax;把高位商入栈
mov ax,bx;从bx还原被除数低16位到ax,此时dx保存的是高位除法余数不变.
div cx;结果中,ax中位存储的是原被除数低16位除法的商,dx保存的为低16位除法余数
mov cx,dx;按要求,把余数赋给cx
pop dx把高位商弹栈存入dx,ax不变
pop bx
ret
code ends
end start 关于实验10(2)代码方案探讨
感谢你分享了不同的思路和代码实现。在这个例子中,你通过借用 bx 寄存器来暂存值,从而完成了更简洁的除法操作。下面我来简要解释一下代码的关键步骤:
[*]初始化寄存器: 你用 ax 和 dx 代表被除数的低位和高位,使用 cx 作为除数。
[*]保存和调整寄存器: 使用 push bx 保存 bx 的值,然后将 ax 的值转存到 bx,方便后续操作。
[*]执行高位除法: 再把被除数的高位和低位分别存入 ax 和 dx,进行除法操作,计算高位商。
[*]执行低位除法: 将初始被除数的低位存入 ax,进行低位除法。
[*]恢复和保存结果: 最后将余数和高位商保存在相应的寄存器中,并通过出栈操作恢复 bx 的值。
在代码中使用了堆栈操作和寄存器复用技巧,让程序更加高效。
assume cs:code
code segment
start:mov ax,4240h;被除数低位
mov dx,000fh;被除数高位
mov cx,0ah;除数
call divdw
int 10h
mov ax,4c00h
int 21h
divdw:push bx;保存当前bx值
mov bx,ax;将ax值保存到bx
mov ax,dx;将被除数高位赋值给ax
mov dx,0 ;高位除法的dx初始化为0
div cx;进行高位除法
push ax ;保存高位商
mov ax,bx;还原被除数低位
div cx;进行低位除法
mov cx,dx;保存余数到cx
pop dx;弹出高位商
pop bx;恢复bx
ret
code ends
end start
如果有任何疑问或进一步的探讨,欢迎随时交流!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 发布帖子时,忘记删除 int 10h了。开始调试时加上的,实际不需要中断代码。 laocaiye 发表于 2025-03-03 14:58
发布帖子时,忘记删除 int 10h了。开始调试时加上的, ...
好的,您可以在发布的代码中删除不需要的 int 10h 中断调用,以下是修改后的代码:
assume cs:code
code segment
start:mov ax,4240h;被除数低位
mov dx,000fh;被除数高位
mov cx,0ah;除数
call divdw
mov ax,4c00h
int 21h
divdw:push bx;保存当前bx值
mov bx,ax;将ax值保存到bx
mov ax,dx;将被除数高位赋值给ax
mov dx,0 ;高位除法的dx初始化为0
div cx;进行高位除法
push ax ;保存高位商
mov ax,bx;还原被除数低位
div cx;进行低位除法
mov cx,dx;保存余数到cx
pop dx;弹出高位商
pop bx;恢复bx
ret
code ends
end start
这样一来,代码会更简洁而且避免不必要的中断调用影响程序运行。有什么问题欢迎继续交流!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页:
[1]