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. 初读"Thinking in Java"读书笔记之第二章 --- 一切都是对象

    用引用操纵对象 Java里一切都被视为对象,通过操纵对象的一个"引用"来操纵对象. 例如, 可以将遥控器视为引用,电视机视为对象. 创建一个引用,不一定需要有一个对象与之关联,但此 ...

  3. python3之运算符

    1.python算术运算符 >>> a=15 >>> b=5 >>> a+b #加 20 >>> a-b #减 10 >& ...

  4. Linux CentOS 6.5 配置网络

    网卡说明 第一块网卡为配置外网:eth0 第二块网卡为配置内网:eth1(没有外网的机器也要将内网配置在第二块网卡上) 1.使用ifconfig查看网卡配置信息 2.修改网卡1配置文件/etc/sys ...

  5. Unity3d 5.x AssetBundle打包与加载

    1.AssetBundle打包 unity 5.x版本AssetBundle打包,只需要设置好AssetBundle的名称后,unity会自动将其打包,无需处理其他,唯独需要做的是设置好个AssetB ...

  6. Gulp 插件及其使用

    前端现在有很多的自动打包工具,各有优缺点,而gulp作为其中的一员,也有着很受人们的青睐,简单粗暴,然而gulp本身并没有提供很多的API,真正的一些工作则是靠着插件完成的,本文简单介绍一些常用的gu ...

  7. 如何在java注解中加入原生html标签内容

    你是否也遇到过类似的事情.想在java注解加入类似于下面这种注释: 结果出来却变成了这样 ,标签被解析了, 这怎么办呢 : 且看分解 我们在注解中直接放入下边这样的代码: <Response&g ...

  8. I2S协议

    (一)I2S总线概述: 音响数据的采集.处理和传输是多媒体技术的重要组成部分.众多的数字音频系统已经进入消费市场,例如数字音频录音带.数字声音处理器.对于设备和生产厂家来说,标准化的信息传输结构可以提 ...

  9. 深入一致性哈希(Consistent Hashing)算法原理,并附100行代码实现

    转自:https://my.oschina.net/yaohonv/blog/1610096 本文为实现分布式任务调度系统中用到的一些关键技术点分享——Consistent Hashing算法原理和J ...

  10. UVA11636-Hello World!-水题

    Hello World! Time limit: 1.000 seconds When you first made the computer to print the sentence "H ...