目录
实验任务
- 编程完成问题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
|
运行程序前:
运行程序后:
- 有如下定义
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 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