(十四)《汇编语言(王爽)》 | 实验 9:根据材料编程


1. 预备知识

80×25 彩色字符模式显示缓冲区的结构为:

  • 内存地址空间中,B8000H~BFFFFH 共 32 KB 的空间为 80×25 彩色字符模式的显示缓存区。向这个地址空间写入数据,写入的内容将立即出现在显示器上。
  • 在 80×25 彩色字符模式下,显示器可以显示 25 行,每行 80 个字符,每个字符可以有 256 种属性(背景色、前景色、闪烁、高亮等组合信息)。
  • 这样,一个字符在该显示缓冲区内占两个字节,一个字节表示字符的 ASCII 码、另一个表示字符的属性
  • 80×25 模式下,显示缓冲区一共 8 页,一屏的内容在显示缓冲区总共占 4000 个字节,即表示一页,第 0 页的地址为 B8000H~B8F9FH。
  • 在显示器中每行 80 字符共占 160 字节,一个字符占两个字节的存储空间,低位字节存储字符的 ASCII 码、高位字节存储字节的属性值。如在显示器的 0 行 0 列显示黑底绿色的字符串 ABCDEF,字符 A 的 ASCII 码值为 41,02 表示黑底绿色字体:
B800:0000	41 02 42 02 43 02 44 02 45 02 46 02 ...
  • 在屏幕上显示的字符,具有前景和背景两种颜色,字符还可以有高亮度和闪烁的显示方式,这些都是表示字符的属性。各属性的表示方法如下:
    [7]    [6    5    4]    [3]   [2    1    0]
    闪烁      背景(RGB)      高亮     前景(RGB)

我们可以按位设置表示字符属性的字节,如:

红底绿字:0100 0010
红底闪烁绿字:1100 0010
红底高亮绿字:0100 1010
黑底白字:0000 0111
白底蓝字:0111 0001

2. 实验任务

编程:在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串 ‘welcome to masm!’。

  • 绿色字体对应的属性编码为 0000 0010,绿底红色对应的属性编码为 0010 0100,白底蓝色对应的属性编码为:0111 0001,十六进制分别为 02H,24H,71H。
  • 题目要求在屏幕中间显示字符串,80×25 彩色模式下,显示器可以显示 25 行数据,每行 80 个字符。一屏幕为 4000 字节。一共写入字节数为 16*2*3=96,所以字节写入范围为 1952~2047,即字符起始偏移地址为 1952(偏移地址本应为 1953,但规定偶数地址存放字符、奇数地址存放字符属性)。
  • 由于每个字符串需要用 16*2=32 个字节表示,所以两两字符串间的偏移为 32
assume cs:codesg

data segment
	db 'welcome to masm!'	;操作字符串
data ends

codesg segment
start:
	mov ax,data 
	mov ds,ax		;段寄存器DS指向数据段
	mov ax,0B800h	
	mov es,ax		;段寄存器ES指向彩色模式区域
	mov bx,0		;控制字符的读取
	mov si,1952		;控制字符的写入,起始偏移地址为1946
	mov cx,16		;循环次数
s:
	mov al,ds:[bx]		;将当前处理字符放到寄存器AL中
	
	mov es:[si],al		;当前字符的第一个位置
	mov ah,02h			;第一种属性,绿色字体
	mov es:[si+1],ah	;当前字符的第一个属性
 	
	mov es:[si+32],al	;当前字符的第二个位置,相对于第一个字符串偏移32
	mov ah,24h			;第二种属性,绿底红色
	mov es:[si+32+1],ah	;当前字符的第二种属性
	
	mov es:[si+64],al	;当前字符的第三个位置,相对于第一个字符串偏移64
	mov ah,71h			;第三种属性,白底蓝色
	mov es:[si+64+1],ah	;当前字符的第三种属性
	
	add bx,1			;每次偏移1个字节处理1个字符
	add si,2			;每次偏移2个字节写入1个字符
	loop s 
	
	mov ax,4c00h
	int 21h
codesg ends 
end start

请添加图片描述


3. 总结

在 80×25 彩色模式下,每个字符使用两个字节表示,偶数地址字节存放字符的 ASCII 码值、奇数地址字节存放字符的属性。


  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值