
关于王爽《汇编语言》实验10.3的疑问
assumecs:codedatasegmentdb10dup(0)dataendscodesegmentstart:movax,12666movbx,datamovds...
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
mov dx,0;这条指令删除后,窗口就一闪而过了,加了之后就可以显示结果,什么原因???
call dtoc
mov dh,1
mov dl,3
mov cl,2
call show_str
dtoc: mov bx,10
s: mov cx,ax ;保存商,商为0就退出循环
div word ptr bx
add dx,30h ;余数
mov ds:[si],dx
mov dx,0
inc si
loop s
ret
show_str:mov bx,0b800h
mov es,bx ;Video Memory
mov di,0
mov ah,0
mov si,0
mov al,0a0h ;160位一行
dec dh ;行数减1
mul dh ;al乘以dh,积为ax
dec dl ;计算列数
add dl,dl ;由于每个字占两位,低位为字,高位为颜色
add al,dl
mov bx,ax ;计算字母显示的位置
mov al,cl
mov ch,0
s1: mov byte ptr cl,ds:[si]
mov es:[bx+di],cl
mov es:[bx+di+1],al
jcxz ok
inc si
add di,2
jmp short s1
ok: mov ah,1
int 21H
code ends
end start 展开
data segment
db 10 dup(0)
data ends
code segment
start:mov ax,12666
mov bx,data
mov ds,bx
mov si,0
mov dx,0;这条指令删除后,窗口就一闪而过了,加了之后就可以显示结果,什么原因???
call dtoc
mov dh,1
mov dl,3
mov cl,2
call show_str
dtoc: mov bx,10
s: mov cx,ax ;保存商,商为0就退出循环
div word ptr bx
add dx,30h ;余数
mov ds:[si],dx
mov dx,0
inc si
loop s
ret
show_str:mov bx,0b800h
mov es,bx ;Video Memory
mov di,0
mov ah,0
mov si,0
mov al,0a0h ;160位一行
dec dh ;行数减1
mul dh ;al乘以dh,积为ax
dec dl ;计算列数
add dl,dl ;由于每个字占两位,低位为字,高位为颜色
add al,dl
mov bx,ax ;计算字母显示的位置
mov al,cl
mov ch,0
s1: mov byte ptr cl,ds:[si]
mov es:[bx+di],cl
mov es:[bx+di+1],al
jcxz ok
inc si
add di,2
jmp short s1
ok: mov ah,1
int 21H
code ends
end start 展开
2个回答
展开全部
dtoc子程序中,有条除数是16位的除法指令div word ptr bx,
被除数高16默认保存于DX,低16位默认保存于AX,
主程序call dtoc之前,mov dx,0指令作用是将被除数高16位清零。
若call dtoc之前无mov dx,0指令,会发生除法溢出。
被除数高16默认保存于DX,低16位默认保存于AX,
主程序call dtoc之前,mov dx,0指令作用是将被除数高16位清零。
若call dtoc之前无mov dx,0指令,会发生除法溢出。
追问
谢谢啊,不过为什么我用debug查看dx的值,没有mov dx,0这条指令,dx也是0啊
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询