汇编将数据以十进制格式显示在屏幕上
2012-06-01 15:26 youxin 阅读(2733) 评论(0) 编辑 收藏 举报子程序描述
名称:dtoc
功能:将word型数据转变为表示十进制数的字符串
参数:(ax)=word型数据
ds:si指向字符串的首地址
应用举例:将数据12666以十进制形式在屏幕的8行3列,用绿色显示出来。
分析: 要得到字符串“12666”,就是要得到一列表示该字符的ascii吗,31h,32h,36h,36h,36h.
十进制数码字符对应的ascii=十进制数码值+30h
看我最开始写的一段代码,是有问题的,不能逆序输出,输出的是66621
dtoc: push ax push bx push cx push dx push si mov bx,10 s: mov dx,0 div bx;ax存放商,dx余数 add dl,30h ;dh 没用 mov ds:[si],dl inc si mov cx,ax jcxz dtoc_ok jmp short s dtoc_ok: pop si pop dx pop cx pop bx pop ax ret
怎么才能逆序输出呢?没有什么好的办法,把结果一个一个保存到栈中,注意栈是以字为操作单位的,而且,为了正确的循环,我们还有统计余数的个数。
assume cs:code data segment
db 16 dup(0) data ends code segment start: mov ax,12666 mov bx,data mov ds,bx mov si,0 call dtoc mov dh,8 mov dl,3 mov cl,2 call show_str mov ah,4c int 21h dtoc: push bx push cx push ax push si push bx mov bx,0 s1: mov cx,10d mov dx,0 div cx ;dx余,ax商 mov cx,ax jcxz s2 add dx,30h push dx inc bx ;bx是统计余数的个数 jmp s1 s2: add dx,30h ;s2很重要,不能忽略 push dx inc bx ;再进行一次栈操作(补充当"商为零而余数不为零"时的情况) mov cx,bx mov si,0 s3: pop ax mov [si],al inc si loop s3 ok: pop bx pop si pop ax pop cx pop dx ret ;数值显示的子程序定义结束 show_str: push ax push bx push cx push dx push es ;bx=160*(lines-1) sub dh,1 mov al,160 mul dh mov bx,ax ;ax=lie*2-2 mov al,2 mul dl sub ax,2 add bx,ax ; 偏移地址存在bx中了 mov ax,0b800h mov es,ax mov dl,cl ;dl存放字符颜色属性 mov ch,0 s_show_str: mov cl,ds:[si] mov es:[bx],cl jcxz ok_show_str mov es:[bx+1],dl inc si add bx,2 jmp short s_show_str ok_show_str: pop es pop dx pop cx pop bx pop ax ret code ends end start
可以用下面的代码简化:
mov di,0 ;di计数 mov bx,10 s:mov dx,0 div bx ;dx 余 ax 商 mov cx,ax add dx,30h push dx inc di jcxz s1 jmp short s s1: mov cx,di s2: pop ax mov ds:[si],al; inc si loop s2
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通