; 编程:在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串 'welcome to masm!'
assume cs:codesg , ds:datasg , ss:stacksg
datasg segment
db 'welcome to masm!'                 ;要显示字符串
db 2h , 24h , 71h                            ;3行字符串分别的显示效果
datasg ends
stacksg segment
dw 0h,0h,0h,0h,0h,0h,0h,0h          ;其实2个字单元就可以搞定了,程序只用到了2个字单元;刚开始写习惯性开辟16个字节刚好一行;这段空间是为了暂存一些子程序要重复用到的寄存器的值。
stacksg ends
codesg segment
start:  mov ax , datasg
mov ds , ax
mov ax , stacksg
mov ss , ax
mov sp , 16                                  ;设置栈顶偏移,指向空栈的下一位16
mov ax , 0B872h   
;一页25行,设置显示的第一行的位置
                                              ;SA=0B800,EA=6E0H(12行的偏移,11*160(每行160个字节)=1760)+40H【偏移到中间,(160-16*2(一个字母还要在后面存贮一个显示属性,16*2算出显示指定字符串要占用的字节,然后用一行总的字节数减去显示占用的,剩下没用过的空间除以二得出一行偏移多少可以在中间显示字符串) )%2=64】
                                              ;SA+EA=0B8720H, cpu寄存器有限,为了节省寄存器,可以直接设置SA=0B87c,后面偏移在*16+EA(A0)结果都一样
mov cx , 3               ;要显示3行,设置循环3次
mov bx , 0              ;用来控制偏移,获取颜色,第一次循环为0,后面获取的是第一个颜色2h;第二次循环为1,获取第二个颜色24h ...
s:      mov es , ax                   ;用附加段寄存器存贮设置的显示缓冲区地址
push ax                         ;进栈保存ax,也就是初始的显示缓冲区地址
push cx                        ;后面还用到循环,只能先进栈保存最外层循环
mov si , 0                      ;偏移读取字符
mov di , 0                     ;偏移存贮读取到底字符
mov cx , 16                  ;循环16次读取字符串
s0:   mov al , [si]                                       ;一个字符8位,用al暂存读到的字符
mov es:[di] , al                                 ;把读到的数据存到显示缓冲区
inc si                                                 ;偏移读取下一个字符
add di , 2                                           ;存储下一个读到的字符,应为显示缓冲区每个字符后面要存放颜色属性,所以先空开来
loop s0
mov al , [bx+si]          ;获取第一个颜色,第一次循环后si=16,刚好指向数据段的2h
mov cx , 16
mov di , 1                   ;偶数偏移存放的是字符,对应的基数单元存放颜色属性,设置初试值1
s1:   mov es:[di] , al
add di , 2
loop s1                ;循环结束,第一行字符串的显示位置,颜色,内容设置完成
pop cx                 ;取出最开始外层循环进行设置第二行
pop ax                 ;取出初始显示缓冲区地址放入ax
add ax , 000ah    ;一行160字节=40H,ax*16+40得到下一行显示起始的位置;节省寄存器,%16,当做SA
inc bx                   ;bx+1,下次读取第二个颜色
loop s                   ;执行最外层循环,cx=cx-1=2
mov ax , 4c00h
int 21h
codesg ends
end start
  //最终结果
知识背景:
80*25彩色字符模式显示缓冲区结构,内存地址B8000H~BFFFFH,编程中要加上0在最开头,不然就错了。0B8000H~0BFFFFH;向这个地址空间写入数据,写入的内容将 立即出现在显示器。
显示器可以显示25行,每行80个字符(00 00),每个字符有256中属性。(背景色、前景色、闪烁、高亮等组合信息)
一个字符在显示缓冲区要占两个字节(00 00),分别存放字符ascii和属性。一屏的内容在显示缓冲区占4000个字节。
显示缓冲区分8页,显示第0页的内容就是0B8000H~B8F9F
在一页显示缓冲区中:  
偏移 000~09F 对应显示器上的第1行(80个字符占160个字节)
偏移 0A0~13F 对应显示器上的第2行(1*160=A0H)
偏移 140~1DF 对应显示器上的第3行(2*160=140H)
题目要在屏幕中间,就应该在第12行显示第一串字符,每行0~159个字符,11*160=1760(6E0H)刚好是第12行首地址;
F00~F9F 对应25行(24*160)
00~01 单元对应显示器第1列
02~03 单元对应显示器第2列
...
9E~9F 单元对应显示器第80列(79*2=9EH)
eg:显示器的第0行第0列显示红底绿色高亮闪烁字符串‘ABCDEF’
  //字符串一直在闪  
*用汇编语言编程中, 凡是4位16进制数据最高位为字母(ABCDEF),必须在前面加数字0,编译器好识别是一个数。

转载于:https://www.cnblogs.com/meihao1203/p/7292116.html

编程:在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串 'welcome to masm!'...相关推荐

  1. 编程:在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串'welcome to masm!'

    80*25彩色字符模式显示缓冲区的结构: 内存地址空间中,B8000H~BFFFFH共32KB的空间,为80*25彩色字符模式的显示缓冲区.向这个地址空间写入数据,写入的内容将立即出现在显示器上. 在 ...

  2. 汇编笔记-在屏幕中间分别显示绿色,绿底红色,白底蓝色的字符串“welcome to masm!”

    ; 王爽-汇编语言-第9章 ; 完成目标:在屏幕中间分别显示绿色,绿底红色,白底蓝色的字符串"welcome to masm!" ; 其它需要知道的知识点: ; 1. 内存空间中, ...

  3. 解决 git 文件夹不显示绿色图标和红色图标的问题

    问题描述:安装好git后,被管理的文件没有绿色图标和红色图标. 解决: 1. 修改注册表: Win + r 打开运行窗口,输入 regedit.exe,如下图所示: 2.找路径: 依次找到如下路径: ...

  4. Git小乌龟的安装及使用技巧(文件夹显示红绿)

    1.git   https://git-scm.com/downloads 2.git小乌龟    https://tortoisegit.org/download/ 3. 安装语言包https:// ...

  5. 汉字在屏幕上的显示过程以及乱码的原因

    一.计算机中的显示原理 要想在计算机的显示器上显示文字,首先你得写一个程序,这个程序的任务就是就是把文字的显示信息发给显卡,显示信息包括在这个屏幕上的输出位置.字的大小等等.然后显卡就知道怎么显示这个 ...

  6. 从点阵到OLED屏幕——动态扫描显示原理

    在我们买电脑.手机或者电视时,厂家常常会宣传他们的产品用的是什么屏幕,分辨率达到2K或者4K,色彩有多鲜艳,刷新率有多高. 这些参数到底是什么意思?屏幕到底是如何显示出我们想要的文字.图片以及视频呢? ...

  7. 微型计算机原理怎么编程,微机原理实验一编程实现键盘输入和显示

    <微机原理实验一编程实现键盘输入和显示>由会员分享,可在线阅读,更多相关<微机原理实验一编程实现键盘输入和显示(9页珍藏版)>请在人人文库网上搜索. 1.实验一编程实现键盘输入 ...

  8. c语言在屏幕上显示字母,C语言在屏幕上的显示内容

    C语言是一门通用计算机编程语言,那么大家知道C语言在屏幕上的显示内容是什么呢?下面一起来看看! 我们有两种方式从计算机获得信息:一是看屏幕上的文字.图片.视频等,二是听从喇叭发出来的声音. 让喇叭发出 ...

  9. 超大计算机屏幕台历时钟,大屏幕日历时钟显示-系统.pdf

    ( ) 天津纺织工学院学报 第16卷第4期 1997 . 16 . 4 ( 1997) JOU RNAL O F T IAN J IN IN ST ITU T E O F V o l N o . 55 ...

最新文章

  1. 26张图带你彻底搞懂volatile关键字
  2. 2020 诺贝尔奖「第一棒」:英美三位科学家摘得桂冠!
  3. 6月8日云栖精选夜读丨阿里云宣布与国内规模最大的汽车企业上汽集团合作
  4. 2014\Province_C_C++_B\7 六角填数
  5. android图片加载库Glide
  6. 解决:VS中进行Qt开发,编译时报错:打不开QWidgets.h等文件的问题
  7. 请教一个ghost恢复的问题
  8. PHP设计模式——命令模式
  9. 计算机考研专业课数字,2020北京航空航天大学计算机考研初试专业课经验
  10. 计算机仿真 matlab,计算机仿真(matlab)PPT教程.ppt
  11. 样本峰度(kurtosis)与随机变量的峰度及四阶统计量之间的关系和计算估计
  12. oeasy教您玩转vim - 60- # vim选项
  13. java 生成树形_Java实现生成Excel树形表头完整代码示例
  14. Python图像处理库PIL的基本概念介绍(一)
  15. 1800首免版权背景音乐素材,适合vlog短视频bgm纯音乐下载
  16. eyebeam电话呼叫软件使用及配置方法
  17. 一次大文件上传失败的排查
  18. GitHub下载加速利器
  19. 1.初识JAVA概念、配置开发环境
  20. NIST Cybersecurity White Paper 2021

热门文章

  1. Flink CDC 核心组件 Debezium 1.8.0.Beta1 发布!多个重磅特性解读!
  2. 推荐好用的免费采集工具
  3. 5000行代码入门mysql基础,10小时精通
  4. springboot+jsp学生综合素质测评系统
  5. React行内样式的写法
  6. svn : RA layer request failed
  7. jQuery---面试题
  8. 群晖的通过CIFS,FTP,HTTP下载
  9. 附PDF | 凯叔讲故事:用户增长的杠杆效应
  10. 计算机切换用户屏幕闪,怎么改另一个用户的桌面