望大神指点
assume cs:codedata 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:,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:
mov es:,al
mov es:,dl
mov cl,ds:
mov ch,0
dec si
add di,2
jcxz s10
jmp s8
s10:ret
code ends
end start
为什么我单步执行可以,直接运行会报错,显示除法溢出呢 试试我修改的代码:
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:,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:
or al,al
jz s10
stosb
mov al,cl
stosb
dec si
jmp s8
s10: ret
show_str endp
code ends
end main jackz007 发表于 2019-3-18 12:23
试试我修改的代码:
谢谢,刚刚我看了你给我的代码运行是不会报错的。后面我又重新查了下我的,是除法前dx没有初始化造成的。{:5_109:} 独孤王道 发表于 2019-3-19 14:39
谢谢,刚刚我看了你给我的代码运行是不会报错的。后面我又重新查了下我的,是除法前dx没有初始化造成的。 ...
做16位除法的时候,如果没有特别用到 dx 就一定要把它置为 0 值,这是特别容易被忽视和出问题的地方。
你的代码首次执行 div 指令的时候,没有始化 dx,但是,进入循环以后就有了。
页:
[1]