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. Spring中配置数据源的四种方式

    1.spring自带的数据源 <bean id="dataSource" class="org.springframework.jdbc.datasource.Dr ...

  2. 使用ui-route实现多层嵌套路由

    一.预期实现效果: https://liyuan-meng.github.io/uiRouter-app/index.html (项目地址:https://github.com/liyuan-meng ...

  3. 在Ubuntu14.04上搭建自己的OpenVPN服务器并通过它上网

    背景 学校宿舍端口可以配置静态IP连校内网,也可以连到实验室的服务器:实验室的服务器可以连外网:但宿舍要连外网就要花钱买PPPoE账号了.作为壮哉我大计院的一员,本着发扬专(neng)业(sheng) ...

  4. Python基础-*args和**kwargs魔法变量

    在学习Python时,总会遇到*args和**kwargs这两个魔法变量,那么它们到底是什么? 首先,并不是必须写成*args和**kwargs.只有变量前面的*(星号)才是必须的,你也可以写成*va ...

  5. 关于“System.Data.OleDb.OleDbException,外部数据库驱动程序 (1) 中的意外错误。”的解决方案

    网站之前运行一直很正常,但有一次用户在导入格式为xls的excel文件,发生了错误,跟踪错误后抛出如下的异常: 错误提示: 未处理System.Data.OleDb.OleDbException HR ...

  6. KandQ:那年,那树,那些知识点

    写在前面:  对于数据结构的学习,注定绕不开"树"这一起着重要作用的数据结构."树"在整个数据结构的学习过程中具有举足轻重的地位,而与"树" ...

  7. 原来你是这样的JAVA[03]-继承、多态、抽象类

    一.继承 Java中的继承使用关键字extends ,跟C#的语法略有差别. 1.子类构造器 java会自动在子类的构造器中插入对父类构造器的调用,也就是说在子类可以访问父类之前已经完成了父类的初始化 ...

  8. 记一次python的一些参数

    isdigit把字符串转化为整数 用法 if xx.isdigit(): xx=int(xx) index创建一个小原组,用法print(a.index(b),b)从0开始

  9. HUST 1585 排队

    1585 - 排队 时间限制:1秒 内存限制:128兆 351 次提交 179 次通过 题目描述 BG站在一个有n个人的队伍中,但他并不知道他处于队伍中的哪个位置,他向前向后观察,只能断定他的前方有至 ...

  10. bzoj 1935: [Shoi2007]Tree 园丁的烦恼

    Description 很久很久以前,在遥远的大陆上有一个美丽的国家.统治着这个美丽国家的国王是一个园艺爱好者,在他的皇家花园里种植着各种奇花异草.有一天国王漫步在花园里,若有所思,他问一个园丁道: ...