ck329054222 发表于 2014-4-14 23:36:33

做课程设计一之前实验一下显示,可是出错【自己解决了】

本帖最后由 ck329054222 于 2014-4-15 17:18 编辑

我的问题是。下面的代码运行之后,只显示我设置的双字的后6位,第一位的1怎么也不显示。。。求大神找出问题所在。。
assume cs:code
data segment
db 10 dup (0)
data ends

code segment
start: mov ax,9f0ah
mov dx,0fh
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:push si ;转换为ASCII码并存入数据段
push ax
push cx
push dx

s1:
mov cx,10
call divdw
jcxz kk

add cx,30H
inc si
push cx

jmp short s1 ;每次取余数转换为ASCII码

kk:
add cx,30h
push cx
inc si;最后一个1除以10就跳到这里了,si并没有增加,最后一位1也不在栈里故补偿
mov cx,si ;设置循环次数
mov si,0

s2:
pop dx
mov ds:,dx
inc si
loop s2 ;将ASCII码存入内存

pop dx
pop cx
pop ax
pop si
ret

show_str:push dx ;显示数据段内的字符
push cx
push bx
push ax

mov ax,0b800h
mov es,ax

mov al,0a0h
mul dh
mov bx,ax;ax中为第八行首字节的偏移地址

mov al,2
mul dl
add bx,ax;显存第一个字母的偏移地址

mov ah,cl
mov ch,0
s:
mov cl,ds:
jcxz ok
mov al,cl ;字符放入低八位
mov es:,ax
inc si
add bx,2

jmp short s
ok: pop ax
pop bx
pop cx
pop dx
ret

divdw: ;双字除法
push ax
mov ax,dx;将高16位装入低16位
mov dx,0;装换后,不会产生溢出
div cx;高16位产生高位余数dx,商ax为需要返回的值余数dx
mov bx,ax
pop ax;还原低16位
div cx;ax即为所需返回的商
mov cx,dx;判断最后余是否为0。cx=0,jcxz跳转
mov dx,bx
ret
code ends
end start

ck329054222 发表于 2014-4-15 17:12:27

本帖最后由 ck329054222 于 2014-4-15 17:17 编辑

还是自己解决了。。。关键是数字中间有个0。。
在29到30行之间加上
mov bx,cx
mov cx,ax
把39到40行改成
add bx,30h
push bx
把32到34行改成
add bx,30H
inc si
push bx

页: [1]
查看完整版本: 做课程设计一之前实验一下显示,可是出错【自己解决了】