鱼C论坛

 找回密码
 立即注册
查看: 303|回复: 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
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

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

  • 初始化寄存器: 你用 axdx 代表被除数的低位和高位,使用 cx 作为除数。
  • 保存和调整寄存器: 使用 push bx 保存 bx 的值,然后将 ax 的值转存到 bx,方便后续操作。
  • 执行高位除法: 再把被除数的高位和低位分别存入 axdx,进行除法操作,计算高位商。
  • 执行低位除法: 将初始被除数的低位存入 ax,进行低位除法。
  • 恢复和保存结果: 最后将余数和高位商保存在相应的寄存器中,并通过出栈操作恢复 bx 的值。


在代码中使用了堆栈操作和寄存器复用技巧,让程序更加高效。


  1. assume cs:code

  2. code segment

  3. start:  mov ax,4240h  ;被除数低位
  4.         mov dx,000fh  ;被除数高位
  5.         mov cx,0ah  ;除数

  6.         call divdw

  7.         int 10h
  8.         mov ax,4c00h
  9.         int 21h

  10. divdw:  push bx  ;保存当前bx值

  11.         mov bx,ax  ;将ax值保存到bx
  12.         mov ax,dx  ;将被除数高位赋值给ax
  13.         mov dx,0   ;高位除法的dx初始化为0
  14.         div cx  ;进行高位除法

  15.         push ax   ;保存高位商
  16.         mov ax,bx  ;还原被除数低位
  17.         div cx  ;进行低位除法

  18.         mov cx,dx  ;保存余数到cx
  19.         pop dx  ;弹出高位商
  20.         pop bx  ;恢复bx
  21.         ret

  22. code ends

  23. end start
复制代码


如果有任何疑问或进一步的探讨,欢迎随时交流!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-3-3 14:58:17 | 显示全部楼层
发布帖子时,忘记删除 int 10h了。开始调试时加上的,实际不需要中断代码。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-3-3 14:58:36 | 显示全部楼层
laocaiye 发表于 2025-03-03 14:58
发布帖子时,忘记删除 int 10h了。开始调试时加上的, ...


好的,您可以在发布的代码中删除不需要的 int 10h 中断调用,以下是修改后的代码:


  1. assume cs:code

  2. code segment

  3. start:  mov ax,4240h  ;被除数低位
  4.         mov dx,000fh  ;被除数高位
  5.         mov cx,0ah  ;除数

  6.         call divdw

  7.         mov ax,4c00h
  8.         int 21h

  9. divdw:  push bx  ;保存当前bx值

  10.         mov bx,ax  ;将ax值保存到bx
  11.         mov ax,dx  ;将被除数高位赋值给ax
  12.         mov dx,0   ;高位除法的dx初始化为0
  13.         div cx  ;进行高位除法

  14.         push ax   ;保存高位商
  15.         mov ax,bx  ;还原被除数低位
  16.         div cx  ;进行低位除法

  17.         mov cx,dx  ;保存余数到cx
  18.         pop dx  ;弹出高位商
  19.         pop bx  ;恢复bx
  20.         ret

  21. code ends

  22. end start
复制代码


这样一来,代码会更简洁而且避免不必要的中断调用影响程序运行。有什么问题欢迎继续交流!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-10 02:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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