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


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

  题目要求:在屏幕中间分别显示绿色,绿底红色,白底蓝色的字符串 'welcome to masm!'

  通过阅读教材资料我们能获取的信息如下:
   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

希望对跟我一样的初学者有帮助 .

相关链接

java 程序开发 Java基础知识

流浪D红舞鞋 14 years, 11 months ago

Your Answer