body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;} th{border: 1px solid gray; padding: 4px; background-color: #DDD;} td{border: 1px solid gray; padding: 4px;} tr:nth-child(2n){background-color: #f8f8f8;}

; 编程:在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串 '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,编译器好识别是一个数。

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

  1. [汇编语言]-第九章 在屏幕中间分别显示绿底红色,白底蓝色字符串"welcome to masm!"

    ;在屏幕中间分别显示绿色,绿底红色,白底蓝色字符串"welcome to masm!" assume cs:codesg,ds:datasg,ss:stacksg datasg s ...

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

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

  3. FPGA驱动LCD显示红绿蓝彩条

    实验目的:先简单熟悉LCD灯的驱动和时序图的代码实现.设计功能是让LCD显示红绿蓝三种颜色,即三个彩带.本次实验比较容易实现,主要是对LCD驱动时序图的理解和时序参数的配置. 实验条件:1.LCD原理 ...

  4. win7系统扩展双屏幕时,如何在两个屏幕下都显示任务栏

    扩展屏幕下都显示任务栏!!! win7系统本身无法设置该功能(目前我是不知道) 但可以下载第三方软件来解决该问题. 第一步:Dual Monitor Taskbar 下载软件 下载链接:http:// ...

  5. char *s = getpass()屏幕不回显示 ,返回输入的字符

    char *s = getpass(“please input you name:”)屏幕不回显示 ,返回输入的字符

  6. dell R730 安装windwos 2008 R2在windows loading files...完成后屏幕无信号(iDrac绿屏)

    dell R730 安装windwos 2008 R2在windows loading files...完成后,Starting Windows时屏幕无信号(iDrac绿屏) 解决方法: F2  进行 ...

  7. win7系统扩展双屏幕时,怎样在两个屏幕下都显示任务栏

    扩展屏幕下都显示任务栏!!! win7系统本身无法设置该功能(眼下我是不知道) 但能够下载第三方软件来解决该问题. 第一步:Dual Monitor Taskbar 下载软件 下载链接:http:// ...

  8. Android 利用代码在屏幕中间位置显示ProgressDialog和ProgressBar

    package cc.testprogressdialog; import android.os.Bundle; import android.view.Gravity; import android ...

  9. 解决github提交commit,contributions不统计显示绿色的问题

    最近使用GitHub Desktop时,发现自己好多次的commits都没有被记录在Contributions中,但是点开项目详情里面可以看到自己的commit确实上传成功了,所以就忧伤了,为什么没有 ...

随机推荐

  1. [Micropython]TPYBoardV102 Dfu固件烧写教程

    TPYBoardv10x固件烧写一直是大家比较关心的问题,上次教大家用SWD接口烧写TPYBoard的固件,这次教大家用另一种方式烧写我们TPYBoardv10x的固件,直接用dfu模式烧写固件. 用 ...

  2. iOS性能优化技术

    小小总结,后续继续跟进. 1. 提高应用性能的几个开发细节 * 尽量避免使用constraint实现动画 * 尽量避免使用数组的删除操作 * 尽量避免使用 NSString::stringWithFo ...

  3. [Spark内核] 第38课:BlockManager架构原理、运行流程图和源码解密

    本课主题 BlockManager 运行實例 BlockManager 原理流程图 BlockManager 源码解析 引言 BlockManager 是管理整个Spark运行时的数据读写的,当然也包 ...

  4. ASP.NET MVC 设置区域默认定向

    public override void RegisterArea(AreaRegistrationContext context) { context.MapRoute( "m_defau ...

  5. SGML、HTML、XML、XHTML的关系

    我们先看看它们的历史起源: SGML--1986年国际标准化组织出版发布了一个信息管理方面的国际标准(ISO 8879:1986信息处理). HTML 2.0--1995年11月作为RFC 1866发 ...

  6. InnoDB锁机制

    1. 锁类型 锁是数据库区别与文件系统的一个关键特性,锁机制用于管理对共享资源的并发访问. InnoDB使用的锁类型,分别有: 共享锁(S)和排他锁(X) 意向锁(IS和IX) 自增长锁(AUTO-I ...

  7. View 动画 Animation 运行原理解析

    这次想来梳理一下 View 动画也就是补间动画(ScaleAnimation, AlphaAnimation, TranslationAnimation...)这些动画运行的流程解析.内容并不会去分析 ...

  8. 使用elk转存储日志

    ELK指的是由Elastic公司提供的三个开源组件Elasticsearch.Logstash和Kibana. Logstash:开源的服务器端数据处理管道,能够同时 从多个来源采集数据.转换数据,然 ...

  9. 初学HTML5,你要懂得哪些?

    很多人问过我这个问题,想要做HTML5页面你要懂得哪些知识?而问这个问题的人基本上都是刚听说过或刚接触HTML5,处在迷茫的阶段,他们往往会被一些网上炫酷页面所吸引,然后自己也想学习HTML5,能通过 ...

  10. NOI 2004 郁闷的出纳员

    Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常 ...