编写在显存中显示字符串的子程序
2012-05-29 20:58 youxin 阅读(424) 评论(0) 编辑 收藏 举报第十章 实验十 练习1
; 子程序描述
; 名称:show_str
; 功能:指定位置,用指定颜色,显示一个用0结束的字符串
; 参数:(dh) = 行号(0--24),(dl) = 列号(0--79)
; (cl) = 颜色,ds:si 指向字符串的首地址
; 返回:无
assume cs:code, ds:data data segment db 'Welcome to masm', 0 data ends code segment start: mov ax, data mov ds, ax mov dh, 8 mov dl, 3 mov cl, 2 mov si, 0 call show_str mov ah, 01h ; 不是mov ax, 01h int 21h mov ax, 4c00h int 21h show_str: push ax push bx push cx push dx push es ; 计算好字串开始显示的地址Y = 160*(行数-1) + 列数*2-2, B800 : Y ; 循环将参数里的字串写进显卡内存,并检测到0就返回 ; bx = 160*(行数-1) sub dh, 1 mov al, 160 mul dh mov bx, ax ; bx 为根据行数算出来的偏移值 ; ax = 列数*2-2 ;mov bl, dl mov al, 2 mul dl sub ax, 2 ; 根据列数算出来的偏移值 add bx, ax ; 行数和列数的和存在bx中了 mov ax, 0b800h mov es, ax mov dl, cl ; 保存字体颜色属性 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
颜色属性里2 (00000010代表绿色字体) 66代表红底绿字。
记得 :现场保护的目的是调用子程序之后,能够返回主程序继续执行.因此要对子程序中用到的寄存器,堆栈进行必要的保护.
现阶段 子程序中用到的寄存器最好全入栈 。
【推荐】国内首个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最大的设计失误
· 单元测试从入门到精通