目录

实验任务

  1. 编程完成问题7.9中的程序,要求使用至少两种不同的寻址方式实现。

编程,将 datasg 段中每个单词的前 4 个字母改为大写字母。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
assume cs:codesg,ds:datasg,ss:stacksg
stacksg segment
dw 0,0,0,0,0,0,0,0
stacksg ends
datasg segment
db '1. display '
db '2. brows '
db '3. replace '
db '4. modify '
datasg ends
codesg segment
start:
codesg 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
assume cs:codesg,ss:stacksg,ds:datasg
stacksg segment
dw 0,0,0,0,0,0,0,0
stacksg ends
datasg segment
db '1. display '
db '2. brows '
db '3. replace '
db '4. modify '
datasg ends
codesg segment
start:
;初始化数据段与栈段
mov ax,datasg
mov ds,ax
mov ax,stacksg
mov ss,ax
mov sp,10H
;将数据段作为一个4*16的二维数组
mov bx,0 ;将bx初始化为0,用于定位二维数组的第一维
mov cx,4 ;循环4次,修改四行数据
s: push cx ;将cx入栈,保存第一层循环的状态
mov cx,4 ;将cx赋值为4,改写每行数据的四个数据
;si赋值为3,用于定位数组的第二维,3指向第一个小写字母
mov si,
;嵌套第二层循环
s1: mov al,[bx+si] ;取出小写字母,使用 [bx+si] 的寻址方式
and al,11011111b ;与运算,运算结果为对应的大写字母
mov [bx+si],al ;将运算结果送回数据段
inc si ;si自增,指向下一个字母
loop s1
;嵌套的第二次循环结束
pop cx ;还原cx的状态到第一层循环
add bx,16 ;bx加16,指向下一行
loop s
mov ax,4c00h
int 21H
codesg 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
assume cs:codesg,ss:stacksg,ds:datasg
stacksg segment
dw 0,0,0,0,0,0,0,0
stacksg ends
datasg segment
db '1. display '
db '2. brows '
db '3. replace '
db '4. modify '
datasg ends
codesg segment
start:
mov ax,datasg
mov ds,ax
mov ax,stacksg
mov ss,ax
mov sp,10H
mov bx,0
mov cx,4
s: push cx
mov cx,4
mov si,0 ;无需初始化si指向第一个字母
s1: mov al,[bx+si+3] ;使用 [bx+si+idata] 寻址方式
and al,11011111b
mov [bx+si+3],al ;使用 [bx+si+idata] 寻址方式
inc si
loop s1
pop cx
add bx,16
loop s
mov ax,4c00h
int 21H
codesg ends
end start

运行程序前:

运行程序后:

  1. 有如下定义

DATA SEGMENT

DW 1,1,18 DUP (0)

DATA SEGMENT

请编写程序将裴波那契数列的前20项补充完整。

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
assume cs:codesg,ss:stacksg,ds:datasg
stacksg segment
dw 0,0,0,0,0,0,0,0
stacksg ends
datasg segment
dw 20 dup(0)
datasg ends
codesg segment
start:
;初始化数据段和栈段
mov ax,datasg
mov ds,ax
mov ax,stacksg
mov ss,ax
mov sp,10H
;输入斐波那契函数的前两项
mov ax,1
mov ds:[0],ax
mov ds:[2],ax
;将斐波那契函数的前两项入栈
push ax
push ax
mov cx,18 ;计算前二十位
mov bx,4 ;从第三个字开始存储计算结果
;设当前计算第i项
s: mov dx,0 ;初始化dx用于计算
pop ax ;将i-1项出栈
pop dx ;将i-2项出栈
add dx,ax ;i-1项与i-2项相加
push ax ;将i-1项入栈
push dx ;将i项入栈
mov ds:[bx],dx ;将计算结果存入数据段
add bx,2 ;bx自增,i++,偏移量指向下一个字
loop s
mov ax,4c00h
int 21H
codesg ends
end start

程序运行前数据段:

程序运行后数据段:

数列1到20项的十进制分别为:1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 ,

  1. 猴子第一天摘下若干个桃子,当即吃了一半,不过瘾,又多吃了一个;第二天,吃剩下的桃子的一半,还不过瘾,又多吃了一个;以后每天都吃前一天剩下的一半多一个,到第十天,只剩下一个桃子。求这十天猴子每天拥有的桃子个数。
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
assume cs:codesg,ss:stacksg,ds:datasg
stacksg segment
dw 0,0,0,0,0,0,0,0
stacksg ends
datasg segment
dw 16 dup(0)
datasg ends
codesg segment
start:
;初始化数据段和栈段
mov ax,datasg
mov ds,ax
mov ax,stacksg
mov ss,ax
mov sp,10H
mov ax,1
mov si,18 ;偏移量指向第10个字
mov ds:[si],ax ;存下第十天的数量
push ax ;将第十天的数量入栈
mov cx,9 ;循环9次计算前九天的数量
s: sub si,2 ;si减2,指向上一个字
pop ax ;将前一天的数量出栈
inc ax
mov dx,ax
add dx,ax ;前一天的数量加一后乘以2得到结果
push dx ;将计算结果入栈用于下一次计算
mov ds:[si],dx ;存下结果
loop s
mov ax,4c00h
int 21H
codesg ends
end start

程序运行前数据段:

程序运行后数据段:

将上图数据段的内容翻译成十进制可得桃子数量分别是

1534 766 382 190 94 46 22 10 4 1