1 assume cs:code,ds:data
2 data segment
3 db 'welcome to masm!',0 ; 要显示的字符串,以 0 表示结束
4 data ends
5
6 code segment
7
8 start:
9 mov dh,8 ; 设置字符串的屏幕位置(行、列)
10 mov dl,3 ; 列号
11 mov cl,4 ; 设置字符串颜色
12
13 mov ax,data ; 使用 ds:si 指向字符串的首地址
14 mov ds,ax
15 mov si,0
16
17 call show_str ; 调用显示字符串子函数
18
19 mov ax,4c00h ; 中断退出
20 int 21h
21
22 ;---------------------------------------------
23
24 show_str: ; 子程序开始
25
26 fbefore: ; 子程序中使用的寄存器入栈
27 push es
28 push dx
29 push cx
30 push bx
31 push ax
32
33
34
35 mov al,dh
36 mov bl,50h ; 每行 80 个字符
37 mul bl ; 此刻 ax 存放的是第 dh 行的偏移地址
38 mov dh,0
39 add ax,dx ; 此刻 ax 存放的是第 dh 行 第 dl 列的偏移地址
40 mov bl,cl ; 颜色属性从 cl 保存到 bl 之中
41 mov dx,0b800h ; 显存第一屏开始地址
42
43 myshow: ; 程序变换的主体
44 mov cl,[si] ; 依次送入字符
45 mov ch,0
46 jcxz fafter ; 如果为 (cx)=0 则结束,跳到出栈恢复
47
48 mov dx:[ax],cl ; 将字符送入要显示的屏幕位置
49 mov dx:[ax+1],bl ; 紧挨着设置颜色
50
51 inc si ; 移动到下一个位置
52 add ax,2h
53
54 jmp short myshow ; 继续下一个字符
55
56
57 fafter: ; 子程序中使用的寄存器出栈
58 pop ax
59 pop bx
60 pop cx
61 pop dx
62 pop es
63 ret ; 返回主程序
64 ;---------------------------------------------
65
66 code ends
67 end start ; 一切都结束了
68
69
70 |