鱼C论坛

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

[已解决]以十进制显示字符串时,除法报错

[复制链接]
发表于 2024-2-19 23:04:59 | 显示全部楼层 |阅读模式

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

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

x
assume cs:code,ds:data
data segment
                dw        1234
                dw        10
data ends
code segment
start:                mov ax,data
                        mov ds,ax
                        mov ax,0b840h
                        mov es,ax
                        mov ax,0
                        mov di,160*10
                        add di,40
                        mov si,0
                        mov cx,0
       
                        mov ax,ds:[si]
div_show:                mov bx,ds:[si+2]
                        div bx
                        add dl,30h
                        mov byte ptr es:[di],dl
                        sub di,2
                        mov dx,0
                        mov cx,ax
                        jcxz over
                        jmp div_show                       

over:                        mov ax,4c00h
                        int 21h
                       

               
code ends
end start
*********************************************************
以上是我写的代码,在DEBUG中没问题,可以通过,可是一但运行时,就报告除法错误,Divide overflow,我看了好久,也没有找到问题所在,请大神帮忙看一下,我错在哪里了
最佳答案
2024-2-19 23:05:24
你的代码有一个小错误,在进行除法操作时使用了错误的寄存器。在 x86 汇编中,除数应该被放在寄存器DX:AX中,被除数应该放在AX中。你的代码在执行div指令时,将被除数和除数放在了AX和BX寄存器中。

以下是正确的代码:
  1. assume cs:code,ds:data
  2. data segment
  3.     dw 1234
  4.     dw 10
  5. data ends

  6. code segment
  7. start:
  8.     mov ax, data
  9.     mov ds, ax
  10.     mov ax, 0b800h
  11.     mov es, ax
  12.     xor ax, ax
  13.     mov di, 160 * 10
  14.     add di, 40
  15.     mov si, 0
  16.     mov cx, 0

  17. show_string:
  18.     mov dx, ds:si
  19.     mov bx, ds:si+2
  20.     xor dx, dx
  21.     div bx
  22.     add dl, 30h
  23.     mov byte ptr es:[di], dl
  24.     sub di, 2
  25.     mov dx, 0
  26.     mov cx, ax
  27.     jcxz over
  28.     jmp show_string

  29. over:
  30.     mov ax, 4c00h
  31.     int 21h

  32. code ends
  33. end start
复制代码

请注意,我也对一些其他细节进行了微调。这样你的代码就能正常运行并显示字符串了。希望对你有所帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-2-19 23:05:24 | 显示全部楼层    本楼为最佳答案   
你的代码有一个小错误,在进行除法操作时使用了错误的寄存器。在 x86 汇编中,除数应该被放在寄存器DX:AX中,被除数应该放在AX中。你的代码在执行div指令时,将被除数和除数放在了AX和BX寄存器中。

以下是正确的代码:
  1. assume cs:code,ds:data
  2. data segment
  3.     dw 1234
  4.     dw 10
  5. data ends

  6. code segment
  7. start:
  8.     mov ax, data
  9.     mov ds, ax
  10.     mov ax, 0b800h
  11.     mov es, ax
  12.     xor ax, ax
  13.     mov di, 160 * 10
  14.     add di, 40
  15.     mov si, 0
  16.     mov cx, 0

  17. show_string:
  18.     mov dx, ds:si
  19.     mov bx, ds:si+2
  20.     xor dx, dx
  21.     div bx
  22.     add dl, 30h
  23.     mov byte ptr es:[di], dl
  24.     sub di, 2
  25.     mov dx, 0
  26.     mov cx, ax
  27.     jcxz over
  28.     jmp show_string

  29. over:
  30.     mov ax, 4c00h
  31.     int 21h

  32. code ends
  33. end start
复制代码

请注意,我也对一些其他细节进行了微调。这样你的代码就能正常运行并显示字符串了。希望对你有所帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-19 23:20:14 | 显示全部楼层
FishC 发表于 2024-2-19 23:05
你的代码有一个小错误,在进行除法操作时使用了错误的寄存器。在 x86 汇编中,除数应该被放在寄存器DX:AX中 ...

一语惊醒梦中人,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-19 23:20:23 | 显示全部楼层
liuming1978 发表于 2024-02-19 23:20
一语惊醒梦中人,谢谢


不客气!如果你还有其他问题,随时来问我。祝你在编程的道路上一切顺利!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-1 02:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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