编程:在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串 'welcome to masm!'
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;}
|
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
|
| 偏移 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) |
编程:在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串 'welcome to masm!'的更多相关文章
- [汇编语言]-第九章 在屏幕中间分别显示绿底红色,白底蓝色字符串"welcome to masm!"
;在屏幕中间分别显示绿色,绿底红色,白底蓝色字符串"welcome to masm!" assume cs:codesg,ds:datasg,ss:stacksg datasg s ...
- 编程:在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串'welcome to masm!'
80*25彩色字符模式显示缓冲区的结构: 内存地址空间中,B8000H~BFFFFH共32KB的空间,为80*25彩色字符模式的显示缓冲区.向这个地址空间写入数据,写入的内容将立即出现在显示器上. 在 ...
- FPGA驱动LCD显示红绿蓝彩条
实验目的:先简单熟悉LCD灯的驱动和时序图的代码实现.设计功能是让LCD显示红绿蓝三种颜色,即三个彩带.本次实验比较容易实现,主要是对LCD驱动时序图的理解和时序参数的配置. 实验条件:1.LCD原理 ...
- win7系统扩展双屏幕时,如何在两个屏幕下都显示任务栏
扩展屏幕下都显示任务栏!!! win7系统本身无法设置该功能(目前我是不知道) 但可以下载第三方软件来解决该问题. 第一步:Dual Monitor Taskbar 下载软件 下载链接:http:// ...
- char *s = getpass()屏幕不回显示 ,返回输入的字符
char *s = getpass(“please input you name:”)屏幕不回显示 ,返回输入的字符
- dell R730 安装windwos 2008 R2在windows loading files...完成后屏幕无信号(iDrac绿屏)
dell R730 安装windwos 2008 R2在windows loading files...完成后,Starting Windows时屏幕无信号(iDrac绿屏) 解决方法: F2 进行 ...
- win7系统扩展双屏幕时,怎样在两个屏幕下都显示任务栏
扩展屏幕下都显示任务栏!!! win7系统本身无法设置该功能(眼下我是不知道) 但能够下载第三方软件来解决该问题. 第一步:Dual Monitor Taskbar 下载软件 下载链接:http:// ...
- Android 利用代码在屏幕中间位置显示ProgressDialog和ProgressBar
package cc.testprogressdialog; import android.os.Bundle; import android.view.Gravity; import android ...
- 解决github提交commit,contributions不统计显示绿色的问题
最近使用GitHub Desktop时,发现自己好多次的commits都没有被记录在Contributions中,但是点开项目详情里面可以看到自己的commit确实上传成功了,所以就忧伤了,为什么没有 ...
随机推荐
- springboot mybatis 事务管理
本文主要讲述springboot提供的声明式的事务管理机制. 一.一些概念 声明式的事务管理是基于AOP的,在springboot中可以通过@Transactional注解的方式获得支持,这种方式的优 ...
- islider结合react的简单实用
我用islider都是结合react来使用,主要运用在移动端,做首页轮播图,或者是手机图片预览,左右滑动 首先需要 npm install islider.js --save 让后在jsx文件头部引入 ...
- Django-环境搭建
django开发环境搭建 环境说明 python django mysql pymysql pycharm 安装过程 安装python3.6.3 64位下载地址: https://www.python ...
- 10、ABPZero系列教程之拼多多卖家工具 拼团提醒逻辑功能实现
上篇文章已经封装好了类库,现在继续实现功能,在ABPZero框架的基础上来实现一个完整的功能. Redis缓存 编写功能前先在本机安装好Redis,需要用到Redis做缓存,以下分享2个Windows ...
- Zabbix实战-简易教程(9)--触发器函数(triggers)
Zabbix触发器函数学习 本文主要讲述zabbix触发器函数. 1.abschange 参数:缺省 值类型:float, int, str, text, log 返回值解析: Returns abs ...
- mwValidate.js验证插件
这段时间在公司一直做项目的同时,也学了下js,感觉有必要做一些什么东西出来.思来想去就做了最简单的一个验证插件.我很清楚这个东西市面上已经很多了,但我的目的也很清楚,检验我的学习成果.所以也就无所谓了 ...
- java_web学习(十) 显示mysql中的数据
一.建立数据库 create database animal; create table animal( sno int, name varchar(20), weight varcahr(20), ...
- 12、ABPZero系列教程之拼多多卖家工具 拼团提醒功能登录拼多多实现
上篇文章已经完成了整个拼多多拼团提醒功能,本篇继续完成拼多多帐号登录,拼多多帐号登录的目的是为了获取拼团商品的SKU和订单号,便于商家备货. 以下是拼多多官方的后台登录,要实现的功能并不是直接在这里登 ...
- Android开发艺术探究Note
第一章:Activity的生命周期和启动模式 生命周期 onPause表示activity正在停止,onPaus必须先执行完(栈顶的activity),新的activity的onResume才会执行. ...
- CTF---Web入门第十四题 忘记密码了
忘记密码了分值:20 来源: Justatest 难度:中 参与人数:7706人 Get Flag:2232人 答题人数:2386人 解题通过率:94% 找回密码 格式:SimCTF{ } 解题链接: ...