鱼C论坛

 找回密码
 立即注册
查看: 195|回复: 3

[汇编作业] 关于实验10(2)

[复制链接]
发表于 2025-3-3 14:51:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2025-3-3 14:51:58 | 显示全部楼层
关于实验10(2)代码方案探讨

感谢你分享了不同的思路和代码实现。在这个例子中,你通过借用 bx 寄存器来暂存值,从而完成了更简洁的除法操作。下面我来简要解释一下代码的关键步骤:

  • 初始化寄存器: 你用 axdx 代表被除数的低位和高位,使用 cx 作为除数。
  • 保存和调整寄存器: 使用 push bx 保存 bx 的值,然后将 ax 的值转存到 bx,方便后续操作。
  • 执行高位除法: 再把被除数的高位和低位分别存入 axdx,进行除法操作,计算高位商。
  • 执行低位除法: 将初始被除数的低位存入 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-3-3 14:58:17 | 显示全部楼层
发布帖子时,忘记删除 int 10h了。开始调试时加上的,实际不需要中断代码。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-3-31 09:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表