目录

实验任务

  1. 编写子程序(课本实验10)

图形用户界面, 文本, 应用程序, 电子邮件 描述已自动生成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
assume cs:code,ss:stack,ds:data
data segment
db 'Welcome to masm!',0
data ends
stack segment
db 16 dup(0)
stack ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,10H
mov ax,data
mov ds,ax
mov si,0 ;初始化
mov dh,16
mov dl,16
mov cl,2 ;行号,列号以及颜色
call show_str
mov ax,4c00h
int 21H
show_str:
mov ax,0B800H
mov es,ax ;es指向显存地址
mov al,00A0H ;每行00A0字节
mul dh ;计算出行偏移量
push ax
mov al,2 ;计算出列偏移量
mul dl
pop di ;偏移地址=行偏移量+列偏移量
add di,ax ;存在di中
start_f:
push cx ;颜色入栈
mov cx,0
mov cl,[si] ;取得字符
jcxz end_f ;判断是否为末位0
mov es:[di],cl ;低位存下字符
inc di ;指向高位
pop cx ;颜色出栈
mov es:[di],cl ;高位存下颜色
inc di ;指向显存下一个字
inc si ;指向下一个字符
jmp short start_f
end_f:
pop cx ;取出栈中cx后RET
RET
code ends
end start

结果:

一些文字和图片的手机截图 描述已自动生成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
assume cs:code,ss:stack,ds:data
data segment
num dw 123,12666,1,8,3,38
str db 10 dup(0) ;保存转化为ascii码后的字符串
data ends
stack segment
db 32 dup(0)
stack ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,20H
mov ax,data
mov ds,ax
mov si,0
mov cx,6
mov bx,16 ;在第几行显示
s:
mov ax,[si]
push cx ;保存循环状态
push si ;保存指向第几个数
push bx ;存下行数
mov si,0 ;调用子程序dtoc
call dtoc ;将ax的数值转化为字符串保存在str中
pop bx ;取出行数
mov dh,bl ;行数
mov dl,16 ;列数
mov cl,2
mov si,offset str ;字符串的开始位置
call show_str ;调用子程序show_str
inc bx ;行数加一
pop si
add si,2 ;读取下一个数字
pop cx
loop s
mov ax,4c00h
int 21H
dtoc:
mov bx,10 ;除数
mov dx,0 ;余数
div bx
add dx,30H ;转为ascii码
push dx ;存下余数
inc si ;记录长度
mov cx,ax
jcxz end_d ;被除数为零结束
jmp short dtoc
end_d:
mov cx,si
mov si,0
p: pop ax ;将栈中的余数取出
mov [str+si],al ;保存到str中
inc si
loop p
mov al,0
mov [str+si],al ;str最后一位为0
RET
show_str:
mov ax,0B800H
mov es,ax ;es指向显存地址
mov al,00A0H ;每行00A0字节
mul dh ;计算出行偏移量
push ax
mov al,2 ;计算出列偏移量
mul dl
pop di ;偏移地址=行偏移量+列偏移量
add di,ax ;存在di中

start_f:
push cx ;颜色入栈
mov cx,0
mov cl,[si] ;取得字符
jcxz end_f ;判断是否为末位0
mov es:[di],cl ;低位存下字符
inc di ;指向高位
pop cx ;颜色出栈
mov es:[di],cl ;高位存下颜色
inc di ;指向显存下一个字
inc si ;指向下一个字符
jmp short start_f
end_f:
pop cx ;取出栈中cx后RET
RET

code ends
end start


结果:

  1. 编写子程序(课本实验11)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
assume cs:code

data segment
db "Beginner's All-purpose Symbolic Instruction Code.",0
data ends
code segment
begin:
mov ax,data
mov ds,ax
mov si,0
call letterc ;调用子程序
mov ax,4c00h
int 21h
letterc:
mov ax,0
mov al,[si] ;复制字符到al
mov cx,ax
jcxz end_l ;为0则结束
mov bx,si
inc si ;指向下一个字符
cmp ax,97
jb letterc ;小于'a'则跳过
cmp ax,122
ja letterc ;大于'z'则跳过
sub al,32
mov [bx],al ;转换为大写后覆盖保存
jmp short letterc
end_l:
RET
code ends
end begin

结果:

  1. 编写子程序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
;名称:strcpy
;功能:将ds:si开始存放的字符串str1复制到将es:di开始存放的字符串str2中,str1将以0结尾,复制包括结束标记。调用时保证str2的空间大于str1。
;参数:ds:si开始存放的字符串str1,es:di开始存放的字符串str2
;返回: 无
strcpy PROC
PUSH CX ; 保存CX寄存器的值
MOV CX, 0FFFFh ; 设置CX计数器为最大值
MOV AL, [SI] ; 将str1中的字符读入AL寄存器
MOV [DI], AL ; 将AL中的字符写入str2中
INC SI ; 指向str1中的下一个字符
INC DI ; 指向str2中的下一个字符
LOOPNZ strcpy ; 继续复制,直到str1中的字符为0或者复制完成
POP CX ; 恢复CX寄存器的值
RET ; 返回
strcpy ENDP