经过一番奋斗,终于把第三个子程序写出来了,可以继续做我的课程设计1了,甚是兴奋矣。、
数值显示这道题目出得真是妙,答案很快做出来了,不过一开始显示的是逆置的字符串。那么要考虑的问题就是怎么使得所有的数值显示正常,根据课本给出的转换字符的算法,则在将字符存入data段的时候是需要将字符逆置写入,这个细节方面的东西方法很多,不过感觉自己写的方法还不错,欢迎各位批评!
下面是我的源程序:
assume cs:code
data segment
db 10 dup(0)
data ends
stack segment
db 16 dup(0) ;自定义栈段
stack ends
code segment
start: mov ax, 12666
mov bx, data
mov ds, bx
mov si, 0
mov dx, stack ;自定义栈
mov ss, dx
mov sp, 16
call dtoc
mov dh, 8
mov dl, 3
mov cl, 2
call show_str
mov ax, 4C00H
int 21H
;数字转换成字符串子程序
dtoc:push si;子程序使用的寄存器入栈
push bx
push dx
push cx
push di
mov bx, 10 ;除数为10
s:mov dx, 0 ;被除数的高16位设置为0
div bx ;商保存在ax中,余数在dx中
mov cx, dx ;dx的值放入cx中,为jxcz的操作做好准备
jcxz ok1
push dx ;余数dx入栈
inc di
jmp short s
ok1:mov cx, di ;设置循环计数器
s0:pop dx ;取出余数
add dl, 30H ;数值转换成字符形式
mov [si], dl ;字符写入data段中
inc si
loop s0
pop di;子程序使用的寄存器出栈
pop cx
pop dx
pop bx
pop si
ret
;显示字符串子程序
show_str:push si ;子程序使用的寄存器入栈
push di
push cx
push dx
mov ax, 0B800h
mov es, ax ;显示字符段地址存入es
mov al, 160
mov ah, 0
mul dh
mov bx, ax ;bx为显示字符的偏移地址
add dl, dl
mov dh, 0
mov di, dx ;bi保存显示字符的偏移地址
mov ah, cl ;ah将cl(字符属性)先保存起来
function:mov cl, [si]
mov ch, 0
jcxz ok2
mov al, [si]
mov es:[bx + di],al ;将字符写入显存的相应位置
inc di
mov es:[bx+di], ah ;设置字符属性
inc di
inc si
jmp short function ;跳转到编号function处继续执行
ok2: pop dx ;子程序使用的寄存器出栈
pop cx
pop di
pop si
ret
code ends
end start
文章评论(0条评论)
登录后参与讨论