|
主题 : : 第十章第三个实验为什么在0行3列到0行15列会有乱码显示?请高手帮我看下 [待解决] |
回复[ 2次 ]
点击[ 362次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2008-05-27 13:37 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:0
注册日期:2008-05-13 20:29 |
assume cs:code
data segment
db 16 dup (0)
data ends
stack segment
dw 16 dup (0)
stack ends
code segment
start: mov ax,12666
mov bx,data
mov ds,bx
mov bx,stack
mov bx,0b800h
mov es,bx
mov ss,bx
mov sp,32
mov si,0
call dtoc
mov dh,8
mov dl,3
mov cl,2 ;给show_str子函数设置显示参数。
call show_str ;调用子函数用来显示。
mov ax,4c00h
int 21h
dtoc: push ax
push bx
push cx
push dx
mov bx,0 ;将bx置为0,来做后面的出栈计数器
mov ax,12666
mov dx,0
dt_s: mov cx,10 ;设置将要转换的进制,此处是十进制
call divdw ;调用divdw来进行除法运算。
add cx,30h ;转换为字符形式
push cx ;将字符压栈。
inc bx ;计数器加一。
mov cx,ax
jcxz dt_s0
inc cx
loop dt_s
divdw: push bx
mov bx,ax ;将低16位暂存
mov ax,dx
mov dx,0
div cx ;进行高16位除法运算
push ax ;将高16计算的结果暂存
mov ax,bx ;将低16位送入ax中,好进行低16位的除法运算。
div cx ;进行低16位的除法运算(dx中存有高16位的余数),计算后(ax)为返回值。
mov cx,dx ;将余数返回。
pop dx ;将运算总结果的高16位返回。
pop bx
ret ;子程序返回
dt_s0: mov cx,bx ;将记录的入栈次数送入cx
dec bx ;将计数器bx减一操作。
pop [si]
inc si
loop dt_s0
pop dx
pop cx
pop bx
pop ax
ret
show_str: push ax
push bx
push cx
push dx
push si ;将用到寄存器入栈暂存。
mov al,160
mul dh
add dl,dl
add al,dl ;此三步定位显示的地址,dh,dl在这里做参数好似坐标轴一样。
mov bx,ax ;将显示地址送入bx寄存器。
mov ah,cl ;将颜色参数送入字符中。
mov si,0
mov ch,0
sh_s: mov al,[si] ;将字符串送入al中。
mov cl,al
mov es:[bx],ax ;将字符串显示出来。
jcxz sh_s0
inc cl ;防止ds:[si]刚好为01时,loop无法循环。
inc si ;指向下一个字符
add bx,2 ;将显示单元指向下一个位置。
loop sh_s
sh_s0: pop si
pop dx
pop cx
pop bx
pop ax
ret
code ends
end start
开始我没有调用divdw子函数来做除法运算,但是还是有乱码显示。
程序没有错呀,为什么会有乱码显示咧? | | |
|
|
|
|
[第1楼]
[ 回复时间:2008-05-29 09:10 ]
[引用]
[回复]
[ top ] | |
荣誉值:32
信誉值:0
注册日期:2008-01-15 12:22 |
mov bx,stack
mov bx,0b800h
mov es,bx
mov ss,bx
--------------
这是程序段开始的设置,我怎么感觉怪怪的,把stack的地址给bx没有用啊,bx的值在mov bx,0b800h处又改了,改成了显存的段地址,显然程序运行后的乱码也是因为这样设置的过。 | | |
|
|
|
|
[第2楼]
[ 回复时间:2008-05-29 10:22 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:0
注册日期:2008-05-13 20:29 |
额,是呵~大意了,现在逛论坛后,我感觉把显示地址段0b800在子程序show_str当中定义更加合理。 | | |
|