我的算法如下:存在的主要问题是子程序dtoc在最后循环中将1送入cx后,接着执行loop s0,但cx自己变为0,程序没有跳转,却返回了,不明白.对于输出顺序颠倒问题自己能解决.
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
call dtoc ;16进制转10进制,ax为参数
mov dh,8 ;8行
mov dl,3 ;3列
mov cl,2 ;颜色
call show_str ;显示dx中的内容
mov ax,4c00h
int 21h
dtoc:
mov bx,10
s0: mov dx,0
div bx
add dx,30h ;余数加30
mov ds:[si],dl ;余数送内存
mov cx,ax ;商送cx
inc si ;si加1
jcxz s1
loop s0
s1: ret
show_str:
assume ss:stack
stack segment stack
dw 10 dup(0)
stack ends
mov ax,stack
mov ss,ax
mov ax,0b800h ;显存起始地址b800h
mov es,ax ;送es
mov bl,cl ;字符的颜色参数送bl,腾空cx留待后用
push bx
push dx
mov ah,0
mov al,dh ;行数送al中
mov bx,160
mul bx
pop dx ;压入堆栈,因为后面的mul bx会清除dx中的内容
push ax
mov ax,0 ;ax清0
mov al,dl ;列值送al
mov bx, 2
mul bx ;ax乘以2为行中的准确位置,此指令修改dx
mov bx,ax
pop ax
adc ax,bx
pop bx
mov di,ax
mov si,0
mov ch,0 ;寄存器清零
s2: mov cl,ds:[si] ;字符串首个字符送cl
mov es:[di],cl ;cl中字符送显存
inc di ;di加1
mov es:[di],bl ;颜色参数送显存
inc si ;si加1
inc di ;di加1
jcxz s3 ;判断cx是否为零,不为0则取下一个字符,是0则结束循环
loop s2
s3: ret
code ends
end start |