马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
虽然看起来简单,但真做起来还是有不少问题的。
比如出栈入栈的计数一开始就没有想到。
比如要注意子程序之间寄存器值的相互干扰。。
比如要写好注释,之前写的代码因为没有注释,已经不知道是干什么的了。。
这次用了不少时间,但也算理解的更透彻了一些。
;名称:dtoc
;功能:将word型数据转变为表示十进制的字符串,字符串以0为结尾符号。
;参数:(ax)=word型数据
; ds:si指向字符串的首地址
;返回:无
;
;思路:取一个16进制数,连续除以10,余数的倒序就是10进制数。
; 每个余数+30H就是对应ascii码。
assume cs:code
data segment
dw 123,12666,1,8,38
data ends
code segment
start: mov ax,12666
mov bx,data
mov ds,bx
mov si,0 ;设置ds:si
call dtoc ;进制转换
mov dh,8
mov dl,3
mov cl,2
call show_str ;显存写入
mov ax,4c00h
int 21h
dtoc:
push cx
push si
push dx
mov si,0 ;余数计数
mov bx,10 ;除数
dtoc_s0:
mov dx,0
div bx
mov cx,ax
add dx,30h
jcxz dtoc_ok
push dx
inc si
jmp dtoc_s0
dtoc_ok:
push dx
inc si
mov cx,si
mov si,0
dtoc_ok_s1: ;出栈
pop ax
mov [si],al
inc si
loop dtoc_ok_s1
pop dx
pop si
pop cx
ret
show_str: ;显示字符的子程序
push ax
push bx
push cx
push dx
push si
;计算行号
dec dh
mov ax,0a0h
mul dh
mov bx,ax
;计算列号
mov ax,2
mul dl
sub ax,2
;行号+列号
add ax,bx
;计算显存首地址
mov bx,8000H
add ax,bx
mov di,ax
mov ax,0b000H
mov es,ax ;es:di
;写入数据
mov bl,cl
mov ch,0
show_str_s0:
mov al,[si]
mov es:[di],al
mov es:[di+1],bl
mov cl,[si]
jcxz show_str_s1
inc si
add di,2
jmp short show_str_s0
show_str_s1:
pop si
pop dx
pop cx
pop bx
pop ax
ret
code ends
end start
|