您的位置:首页 > 编程语言

王爽 汇编语言第二版 实验9 根据材料编程 代码及分析

2016-06-12 10:35 549 查看
通过阅读教材资料我们能获取的信息如下:

1、显示器默认显示的缓冲区是:B8000~B8F9F,低字节放字符,高字节放属性

2、存放字符的地址:第一行:B8000~B809F,第二行:B80A0~B813F 第三行:B8140 ~ B81DF

3、即偶数字节放字符,奇数字节放属性

4、如何显示:只要把字符依次放入缓冲区即可

5、颜色属性怎么表示:绿色:0000 0010 (02h),绿底红字:0010 0100(24h),白底蓝字(71h)

我只写了在显示器起始处显示三行,至于在屏幕中间显示,只要加一个偏移量就好了,运行结果如下:



自己写的代码如下,请参考,不知道还能不能再优化一下:

assume cs:codesg,ds:data,ss:stack

data segment
db 'welcome to masm!'
db 2,24h,71h
data ends

stack segment
db 16 dup(0)
stack ends

codesg segment

start:
mov ax,stack  ;定义栈,多重循环需用到栈
mov ss,ax
mov sp,0

mov ax,data     ;定义数据区
mov ds,ax

mov cx,3
mov ax,0B800H  ;缓冲区的第一页首地址
mov es,ax
mov si,10h     ;si偏移至存储颜色的地址
mov ax,0

s:
mov ah,ds:[si]       ;用ah保存字符颜色
push cx      ;将cx,si入栈保存
push si
mov cx,16
mov si,0
mov bx,0
mov di,1

inputCh:              ;输出一行welcome to masm!
mov al,[bx]
mov es :[bx + si],al   ;写字符
mov es:[bx + di],ah    ;写字符属性
inc bx          ;遍历字符串
inc si
inc di
loop inputCh

pop si      ;si出栈
inc si     ;指向下一个颜色
pop cx
mov dx,es   ;接下来三条指令将es指向下一行
add dx,0ah
mov es,dx

loop s

s1:                 ;最初程序执行太快,看不到现象,加一个死循环,用于看结果
jmp short s1

codesg ends
end start
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息