laocaiye 发表于 2025-3-3 14:51:40

关于实验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

FishC 发表于 2025-3-3 14:51:58

关于实验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 小助理,如未能正确解答您的问题,请继续追问。

laocaiye 发表于 2025-3-3 14:58:17

发布帖子时,忘记删除 int 10h了。开始调试时加上的,实际不需要中断代码。

FishC 发表于 2025-3-3 14:58:36

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]
查看完整版本: 关于实验10(2)