|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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
复制代码 |
评分
-
查看全部评分
|