|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
;显存地址 B8000H 开始 BFFFFH 共32kb空间 共8页 每页4kb
;第一页显示偏移
;000~09F显示第一行
;0A0~13F显示第二行
;显存可以25行 每行80个字符 每个字符2个字节 = 160字节
;每个字符占一个字 低位字符存储ASCII 高位字存储属性
;这里从第11开始 160*11 = 6E0
;每个中间开始 80字符-16字符/2各半 * 2个字节 = 40H
;那么起始位置是在 B8000H+6E0+40H = B8720 开始
assume cs:code
code segment
db 'welcome to masm!' ;定义要显示的字符串(共16个字节)
col db 02h,24h,71h ;定义三种颜色属性
dw 8 dup(0)
start:
push ax
push bx
push cx
push si
push di
call show
mov ax, 4c00h
int 21h
show:
mov ax, cs
mov ds, ax
mov ax, cs
mov ss, ax
mov sp, offset start
xor bx,bx ;bx清零,用来索引颜色
mov ax,0b872h ;算出屏幕第12行中间的显存的段起始位置放入ax中;把后面0扔了
mov cx, 3 ;S3循环控制行数,外循环为3次,因为要显示三个字符串
s3: push cx ;
push ax ;三个进栈操作为外循环s3保存相关寄存器的值
; push bx ;以防止它们的值在内循环中被破坏
mov es, ax ;此时es为屏幕第12行中间的显存的段起始位置
mov si, 0 ;源头字符串
mov di, 0 ;定位目标列
mov cx, 10h ;十6个字符串 内循环
s1: mov al, [si] ;源地址 数据
mov ah, col[bx] ;源地址 属性
mov es:[di], al ;目标显存地址
mov es:[di+1], ah ;目标显存属性
inc si
add di, 2
loop s1 ;此循环实现偶地址 低位字符存储ASCII 字符
add bx, 1
pop ax
add ax, 0ah ;mov ax,0b872h 前面把这个设置位启动段地址了 加偏移就好
pop cx
loop s3
pop di
pop si
pop cx
pop bx
pop ax
ret
code ends
end start
|
|