鱼C论坛

 找回密码
 立即注册
查看: 434|回复: 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寄存器中。

以下是正确的代码:
assume cs:code,ds:data
data segment
    dw 1234
    dw 10
data ends

code segment
start:
    mov ax, data
    mov ds, ax
    mov ax, 0b800h
    mov es, ax
    xor ax, ax
    mov di, 160 * 10
    add di, 40
    mov si, 0
    mov cx, 0

show_string:
    mov dx, ds:si
    mov bx, ds:si+2
    xor dx, dx
    div bx
    add dl, 30h
    mov byte ptr es:[di], dl
    sub di, 2
    mov dx, 0
    mov cx, ax
    jcxz over
    jmp show_string

over:
    mov ax, 4c00h
    int 21h

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

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

使用道具 举报

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

以下是正确的代码:
assume cs:code,ds:data
data segment
    dw 1234
    dw 10
data ends

code segment
start:
    mov ax, data
    mov ds, ax
    mov ax, 0b800h
    mov es, ax
    xor ax, ax
    mov di, 160 * 10
    add di, 40
    mov si, 0
    mov cx, 0

show_string:
    mov dx, ds:si
    mov bx, ds:si+2
    xor dx, dx
    div bx
    add dl, 30h
    mov byte ptr es:[di], dl
    sub di, 2
    mov dx, 0
    mov cx, ax
    jcxz over
    jmp show_string

over:
    mov ax, 4c00h
    int 21h

code ends
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-11-21 20:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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