鱼C论坛

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

[已解决]望大神指点

[复制链接]
发表于 2019-3-18 10:53:50 | 显示全部楼层 |阅读模式

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

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

x
assume cs:code

data segment
        db 10 dup (0)
data ends

code segment
        start:        mov ax,12666
                        mov bx,data
                        mov ds,bx
                        mov si,0
                        call dtoc
                        
                        mov dh,8
                        mov dl,3
                        mov cl,2
                        call show_str
                        mov ax,4c00h
                        int 21h
                        
        dtoc:        mov bx,10
                        inc si
                s:        div bx
                        add dl,30h
                        mov ds:[si],dl
                        mov dx,0
                        inc ax
                        mov cx,ax
                        dec ax
                        jcxz s1
                        inc si
                        loop s
                s1:        ret
                
show_str:        dec si
                        mov bl,dh
                        mov dh,0
                        add dl,dl
                        mov di,dx
                        mov dx,0
                        mov bh,0
                        mov ax,160
                        mul bx
                        add ax,160
                        mov bx,ax
                        mov ax,0b800h
                        mov es,ax
                        mov ch,0
                        mov dx,cx
                s8:        mov al,ds:[si]
                        mov es:[bx+di],al
                        mov es:[bx+di+1],dl
                        mov cl,ds:[si]
                        mov ch,0
                        dec si
                        add di,2
                        jcxz s10
                        jmp s8
                s10:ret        
                                
                        
code ends
end start
为什么我单步执行可以,直接运行会报错,显示除法溢出呢
最佳答案
2019-3-18 12:23:34
   试试我修改的代码:
data segment
        db 010h dup (0)
data ends

stack segment stack
        dw 080h dup (0)
stack ends

code segment
        assume cs:code , ds:data , ss:stack
main proc near
                        mov ax,12666
                        mov bx,data
                        mov ds,bx
                        mov si,0
                        call dtoc
                        
                        mov dh,8          ; 第8行
                        mov dl,3          ; 第3列
                        mov cl,2          ; 字符颜色:绿色
                        call show_str
                        
                        xor ax,ax
                        int 016h

                        mov ax,4c00h
                        int 21h
main endp
Align 010h
dtoc proc near
                        mov bx,10
                s:      cwd
                        div bx
                        add dl,30h
                        mov ds:[si],dl
                        or ax,ax
                        jz s1 
                        inc si
                        jmp s
                s1:     ret
dtoc endp
Align 10h
show_str proc near
                        mov ax,0b800h
                        mov es,ax
                        xor bx,bx
                        mov bl,dh
                        dec bx
                        xor dh,dh
                        add dx,dx
                        mov di,dx
                        mov ax,160
                        mul bx
                        add di,ax
                s8:     mov al,ds:[si]
                        or al,al
                        jz s10 
                        stosb
                        mov al,cl
                        stosb
                        dec si
                        jmp s8 
                s10:    ret
show_str endp        
code ends
end main
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-3-18 12:23:34 | 显示全部楼层    本楼为最佳答案   
   试试我修改的代码:
data segment
        db 010h dup (0)
data ends

stack segment stack
        dw 080h dup (0)
stack ends

code segment
        assume cs:code , ds:data , ss:stack
main proc near
                        mov ax,12666
                        mov bx,data
                        mov ds,bx
                        mov si,0
                        call dtoc
                        
                        mov dh,8          ; 第8行
                        mov dl,3          ; 第3列
                        mov cl,2          ; 字符颜色:绿色
                        call show_str
                        
                        xor ax,ax
                        int 016h

                        mov ax,4c00h
                        int 21h
main endp
Align 010h
dtoc proc near
                        mov bx,10
                s:      cwd
                        div bx
                        add dl,30h
                        mov ds:[si],dl
                        or ax,ax
                        jz s1 
                        inc si
                        jmp s
                s1:     ret
dtoc endp
Align 10h
show_str proc near
                        mov ax,0b800h
                        mov es,ax
                        xor bx,bx
                        mov bl,dh
                        dec bx
                        xor dh,dh
                        add dx,dx
                        mov di,dx
                        mov ax,160
                        mul bx
                        add di,ax
                s8:     mov al,ds:[si]
                        or al,al
                        jz s10 
                        stosb
                        mov al,cl
                        stosb
                        dec si
                        jmp s8 
                s10:    ret
show_str endp        
code ends
end main
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-19 14:39:26 | 显示全部楼层
jackz007 发表于 2019-3-18 12:23
试试我修改的代码:

谢谢,刚刚我看了你给我的代码运行是不会报错的。后面我又重新查了下我的,是除法前dx没有初始化造成的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-19 15:18:13 | 显示全部楼层
独孤王道 发表于 2019-3-19 14:39
谢谢,刚刚我看了你给我的代码运行是不会报错的。后面我又重新查了下我的,是除法前dx没有初始化造成的。 ...

     做16位除法的时候,如果没有特别用到 dx 就一定要把它置为 0 值,这是特别容易被忽视和出问题的地方。
     你的代码首次执行 div 指令的时候,没有始化 dx,但是,进入循环以后就有了。  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-7-5 11:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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