assume cs:code
data segment
db 'Welcome to masm!',0
data ends
stack segment
db 32 dup ('0')
stack ends
code segment
start: mov dh, 8
mov dl, 3
mov cl, 2 ;可以把2修改成82h,观看闪烁效果
mov ax, data
mov ds, ax
mov si, 0 ;初始化数据段
mov ax, stack
mov ss, ax
mov sp, 32 ;初始化栈段
call show_str
mov ah, 1
int 21h ;获得键盘输入,使得屏幕可以显示打印的字符串
;按任意键结束程序,有点像命令行的pause命令
mov ax, 4c00h
int 21h
show_str: push cx
push dx
mov ax, 0b800h
mov es, ax ;用es存储显存段地址
sub dh, 1 ; 8 - 1 = 7
mov al, dh ;给al
mov bl, 10 ;10行数据 为一个显示行
mul bl ;显示地址b800:第十行第0列,al乘10在ax中
mov bl, 16 ;还得乘以16,一行16个字节
mul bl
mov bp, ax ;ax中的行首地址暂存到bp中
sub dl, 1 ;3 - 1 = 2
mov al, dl ;al中值为2
mov dl, 2
mul dl ; 2 * 2 积在ax中,列位置
add ax, bp ;8行3行偏移地址 在ax中
mov di, ax ;显示偏移地址放到di中
mov bp, 0 ;不再使用,清空bp
mov bl, cl ;字体颜色放起来
; mov di, 0464h ;160 * 7 第8行; 测试代码
show: mov al, ds:[si]
mov ah, 0
mov cx, ax ;每个数据 放到cx中,jcxz会控制循环结束
mov byte ptr es:[di], al ;显示字符
mov byte ptr es:[di + 1], bl ;显示颜色
;也可以这样
;mov ah, bl
;mov word ptr es:[di]
;后面di应该加1了
jcxz ok
add di, 2 ;显存每次走两个字节
inc si ;数据每次走一个字节
loop show
ok: pop dx
pop cx
ret
code ends
end start
汇编语言 第三版 王爽 实验10 显示字符串 show_str 独立完成
最新推荐文章于 2024-07-08 17:33:51 发布