|
主题 : : 实验9:根据材料编程 (带详细注释)带图片 [待解决] |
回复[ 0次 ]
点击[ 351次 ] | |
荣誉值:10
信誉值:0
注册日期:2011-01-04 11:04 |
实验9:根据材料编程 (带详细注释)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;程序功能:在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串 'welcome to masm!' 。
;作者:chinaljg
;时间:2011年1月17日
assume cs:codesg,ds:datasg
datasg segment
db 'welcome to masm!'
db 02h,24h,71h
;02h,24h,71h的由来:属性字节的格式
;7 6 5 4 3 2 1 0(位)
;BL R G B I R G B
; --------- ---------
;闪烁 背景 高亮 前景
;R:红色 G:绿色 B:蓝色
;02h表示:绿色. 02H(十六进制)=00000010B(二进制),第2位前景G为1表示前景为绿色
;24h表示:绿底红色.24h=00100100B
;71h表示:白底蓝色.71h=01110001B
datasg ends
codesg segment
start:
;bg:black fg:green 00000010B=02h bg:背景fg:前景
;bg:green fg:red 00100100B=24h
;bg:white fg:blue 01110001B=71h
mov ax,datasg
mov ds,ax
mov bx,0 ;ds:[bx]指向字符串第一个字母'w'
mov ax,0b800h
mov es,ax
mov si,0 ;es:[si]指向显示缓冲区第0页,也就是屏幕左上角第1列,第1行.(共80列,25行)
mov di,10h ;用变量di指向颜色,因为'welcome to masm!'正好16个字节,[di]=10h后,指向了02h(绿色),[di].1指向了24h,[di].2指向了71h.
mov cx,16 ;循环次数
s1: mov al,[bx]
mov es:[si].07d0h,al ;第一次循环时,把'w'放在屏幕中间,一个屏幕可放4000个字符,中间就是2000个字符的位置.2000(十进制)=7d0H(十六进制),结果要显示三行字符串,把第一个字符串的'w'放到显示缓冲区
mov es:[si].0870h,al ;用于显示第二行,07d0+a0=0870,a0h就是一行的长度.把第二个字符串的'w'放到显示缓冲区
mov es:[si].0910h,al ;用于显示第三行,0870h+a0h=0910h,把第三个字符串的'w'放到显示缓冲区
mov al,[di] ;把[di]指向的02h(绿色),字符属性通过al传送给es:[si+1].07d0h,注意+1的意义.
mov es:[si+1].07d0h,al
mov al,[di].1
mov es:[si+1].0870h,al ;给第二行的字符加上颜色属性
mov al,[di+2]
mov es:[si+1].0910h,al ;给第三行的字符加上颜色属性
inc bx ;下一个字符
add si,2 ;下一个要显示的字符所对应的显存缓冲区.
loop s1
mov ax,4c00h ;程序正确返回
int 21h
codesg ends
end start
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;不对之处,请高手指正;;;;;;;;;;;;;;;;;
;链接地址:http://www.asmedu.net/blog/user/postcontent.jsp?neighborId=37247&kindLevel=1&kindId=52075&postId=50748 | | |