|
主题 : : 心地善良的请进,实验10.3.它一直在折磨我啊!!!!!!!!! [待解决] |
回复[ 3次 ]
点击[ 403次 ] | |
荣誉值:1
信誉值:8
注册日期:2009-06-27 18:30 |
实验10.3,我花了三天时间,还是卡在这里,有几次想放弃它,都忍住了,朋友们,发扬一下友爱精神吧!看一看,错在哪里?两个子程序单独都运行正常,放在一起就什么也不显示了!!!!!!代码如下:
assume cs:code
data segment
db 10 dup(0)
data ends
stack segment
db 32 dup(0)
stack ends
code segment
start: mov ax,12666
mov bx,data
mov ds,bx
mov bx,stack
mov ss,bx
mov sp,32
mov si,0
call dtoc
mov dh,8
mov dl,3
mov cl,2
call show_str
mov ax,4c00h
int 21h
dtoc: push ax
push si ;PUSH两次SI的目的是,使下面的JCXZ循环条件成立.
push si ;这里取的是SI为0000,也可使用别的寄存器
dtoc1: mov bx,10 ;用32位除法.
mov dx,0
div bx
add dx,30h
push dx ;第一个字0036H入栈.
mov cx,ax ;商送CX
jcxz ok1
jmp short dtoc1
ok1: pop [si] ;将栈中的字送入DS:SI
mov cx,[si] ;DS:SI送CX,以成为循环条件,直到把原SI内容弹出
add si,2
jcxz ok2
jmp short ok1
ok2: pop ax
pop si
ret
show_str: push ax ; 寄存器入栈。
push dx
push si
mov di,0 ;ES段初始
mov bx,0
mov ax,0b800h
mov es,ax
mov al,160 ;至8行
mul dh
mov bx,ax ;送入BX
mov dh,0
add bx,dx ;至3列
add bx,dx
s:push cx ;存CL值
mov ch,0
mov cx,ds:[si] ;判断是否为0
jcxz ok
pop cx ;弹出,以用到CL值即02H
mov ax,ds:[si] ;AX作为中转
mov ah,cl ;颜色属性送高位
mov es:[bx+di],ax ;第一字母及属性送8行3列
add si,2
add di,2
jmp short s
ok:pop cx ;jcxz过来后,莫忘POP CX
pop si
pop dx
pop ax
ret
code ends
end start | | |