|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
下面这个程序的作用是把ax中的值12666显示到dos屏幕上,正确的显示应该是:
可是我运行后显示出来确实这样的:
这个程序我分析了好几天了,一请大家帮忙分析下,帮我看看是哪里出了问题,谢谢!
assume cs:code
data segment
db 10 dup (0)
data ends
stack segment
dw 0,0,0,0,0,0,0,0
stack ends
code segment
start: mov ax,12666
mov bx,data
mov ds,bx
mov si,0
call dtoc ;dtoc的作用是把ax中的内容12666放到定义的data段中
mov dh,8 ;dh表示行
mov dl,3 ;dl表示列
mov cl,2 ;cl表示颜色
call show_str ;show_str的作用是把data段中的字符在屏幕上显示出来
mov ax,4c00h
int 21h
dtoc: mov dx,0
mov bx,10
div bx
add dl,30h
mov ds:[0],dl
mov dx,0
div bx
add dl,30h
mov ds:[1],dl
mov dx,0
div bx
add dl,30h
mov ds:[2],dl
mov dx,0
div bx
add dl,30h
mov ds:[3],dl
mov dx,0
div bx
add dl,30h
mov ds:[4],dl
ret
show_str: mov ax,0b800h
mov es,ax
mov ax,stack
mov ss,ax
mov al,0a0h
mul dh
mov bx,ax ;确定行的位置
mov al,2
mul dl
mov di,ax ;确定列的位置
s: push cx
mov ch,0
mov cl,[si]
jcxz ok ;判断字符是否为0,不为0则执行下面的语句,为0则跳出
pop cx
mov al,ds:[si]
mov es:[bx+di],al ;把data段中的字符放到b800h缓冲区中
mov es:[bx+di+1],cl ;确定字符的颜色
inc si
add di,2
jmp short s
ok: ret
code ends
end start
s: push cx
mov ch,0
mov cl,[si]
jcxz ok ;判断字符是否为0,不为0则执行下面的语句,为0则跳出
pop cx
这一段出问题了 检测到cx为0时 后面的pop没有执行 所以后面ret时指向的IP不对
|
|