编程:在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串 '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确实上传成功了,所以就忧伤了,为什么没有 ...
随机推荐
- 第十二章:Python の 网络编程进阶(一)
本課主題 RabbitMQ 的介紹和操作 Hello RabbitMQ RabbitMQ 的工作队列 消息确应.消息持久化和公平调度模式 RabbitMQ的发布和订阅 RabbitMQ的主题模式 Ra ...
- MyEclipse过期后怎么破解
方法一:写一个程序生成Subscriptioncode import java.io.*; public class MyEclipseGen { private static final Strin ...
- .net随笔--不好归类的
1..cs .Designer.cs .resx三种文件 cs是类文件,不介绍了.Designer.cs是visual studio对cs类文件的自动生成代码的一种补充,在编辑器里用视图的方式对win ...
- Vista 及后续版本的新线程池
在上一篇的博文中,说了下老版本的线程池,在Vista之后,微软重新设计了一套线程池机制,并引入一组新的线程池API,新版线程池相对于老版本的来说,它的可控性更高,它允许程序员自己定义线程池,并规定线程 ...
- ATM机运行代码
实现代码: import java.util.Scanner; public class Atm { public static void main(String[] args) { // TODO ...
- 五分钟学习React(一): 什么是React
在前端的世界里,我们要处理的文件不是太多,而是太少.每天开发项目将html.css.js.图片.字体文件都像大杂烩一般加载都网页上.当应用变得越来越臃肿的时候,会发现js用了那么多全局变量,css的继 ...
- 如何在java注解中加入原生html标签内容
你是否也遇到过类似的事情.想在java注解加入类似于下面这种注释: 结果出来却变成了这样 ,标签被解析了, 这怎么办呢 : 且看分解 我们在注解中直接放入下边这样的代码: <Response&g ...
- dump_stack 分析使用
dump_stack是用来回溯内核运行的信息的,打印内核信息堆栈段: dump_stack原型: void dump_stack(void); 1.使用这个功能时需要将内核配置勾选上: make me ...
- AOP---jdk动态代理的思考
引出问题:动态代理中是谁调用了invoke方法 为了更好的说明情况,我先写一个动态代理类 a.Person类 public interface Person { public void eating( ...
- 在HTML页面中获取当前项目根路径的方法
在HTML页面获取项目根路径的方法: function getRootPath(){ var curPageUrl = window.document.location.href; var rootP ...