第4章 汇编语言程序设计.docx
《第4章 汇编语言程序设计.docx》由会员分享,可在线阅读,更多相关《第4章 汇编语言程序设计.docx(40页珍藏版)》请在冰豆网上搜索。
第4章汇编语言程序设计
习题4
1.什么是“三种基本结构”?
解释“基本”两个字在其中的含义。
答:
三种基本结构指:
顺序结构,选择结构、循环结构。
使用这3种结构,可以编制出任何所需要的程序,因此冠以“基本”结构。
2.什么叫做“控制转移指令”?
它和数据传送、运算指令有什么区别?
它是怎样实现它的功能的?
答:
控制转移指令是可以改变指令执行顺序的指令。
数据传送、运算指令总是顺序执行的,而控制转移指令通过改变和/或寄存器的值,改变了程序指令的执行顺序。
3.指令“”和“[]”作用有什么不同?
请说明。
答:
上述两条指令都是段内近转移指令,但是偏移地址的来源不同。
指令“”执行时,新的偏移地址在寄存器内,“[]”时,目的偏移地址在存储单元中,该存储单元的地址在:
中。
4.已知()=836,X分别取下列值,执行“,X”后,标志位、、、各是什么?
(1)3000H
(2)8000H(3)7(4)0(5)0
答:
上述指令执行后,标志位、、、的状态分别是:
(1)0010
(2)0000(3)0010(4)0101
(5)0001
5.已知()=836,X分别取下列值,执行“,X”后,标志位、、、各是什么?
(1)0001H
(2)8000H(3)0007H(4)0(5)0
答:
上述指令执行后,标志位、、、的状态分别是:
(1)0000
(2)0001(3)0000(4)0001
(5)1000
6.测试名为X的一个字节,如果X的第1,3位均为1,转移到L1,如果只有一位为1,转移到L2,如果两位全为0,转移到L3。
写出对应的指令序列。
答:
AL,X
AL,00001010B
L3
AL,00001010B
L1
L2
7.假设X和2字单元存放有双精度数P,Y和2字单元存放有双精度数Q,下面程序完成了什么工作?
2
X;双精度数P送入,
X
2;计算2*P送入,
2;2P与Q的高位比较
L2;2P(2)
L1;2P>Q,转L1
(1)
Y;如果高位相等,则比较低位
L2;2P的低位小于等于Q的低位,转L2
(2)
L1:
Z,1
L2:
Z,2
:
……
答:
程序根据2P与Q的大小,确定Z的值。
如果2P≤Q,则2
如果2P>Q,则1
请参阅程序注解
8.编写指令序列,将和中较大的绝对值存入,较小的绝对值存入。
答:
1
1:
2
2:
3
3:
……
9.编写指令序列,比较、中的数的绝对值,绝对值较大的数存入,绝对值较小的数存入。
答:
1
1:
2
2:
3
3:
……
10.编写指令序列,如果寄存器存放的是小写字母,把它转换成大写字母,否则不改变内容。
答:
AL,‘a’
AL,‘z’
AL,‘a’-‘A’
:
……
11.计算分段函数:
X的值从键盘输入,Y的值送显示器输出。
答:
10,0,‘X:
$’
20,0,‘:
$’
:
:
:
1
;输入X的值
-2
L2
L1:
3;←3
L2:
3
L3
;←2X
;←4X
;←5X
6;←56
L3:
2;←2
:
2
;输出Y的值
4C00H
21H
12.计算分段函数:
A,B的值从键盘输入,Y的值送显示器输出(∧表示“并且”,∨表示“或者”)。
答:
10,0,‘A:
$’
20,0,‘B:
$’
30,0,‘:
$’
A?
B?
:
:
:
1
;输入A
A,
2
;输入B
B,
L1;B<0,转L1
A,0
L1;A<0,转L1
1
B,0
L2;00,转L2
;0B≠0,无定义,转
1:
B,0
;A≠00,无定义,转
L3:
A
B
L2:
2
L1:
A
B
:
2
;输出Y的值
:
4C00H
21H
说明:
如果把A、B看作是平面直角坐标的两根轴,那么这个函数在A,B的正轴上无定义。
无法计算,也无法输出结果。
13.编写程序,求10元素字数组中绝对值最小的数,存入单元。
答:
-56,+12,88,-126,-5,16,32,-99,72,-18
?
?
:
:
:
;将数组第一个元素假设为绝对值最小的数
32767;最小的绝对值假设为32767
10
:
[]
0
1
;求绝对值
1:
;绝对值与假设的最小绝对值比较
2;假设的绝对值较小,跳过
;保存新的最小绝对值
[];取出新的绝对值最小的数
;保留新的绝对值最小的数
2:
2
4C00H
21H
说明:
一定要预设最小的绝对值和绝对值最小的数,而且这个绝对值最小的数必须来自数组。
14.编写程序,求20元素无符号字数组中最小的奇数,存入单元,如果不存在奇数,将单元清零。
答:
56,12,88,126,5,16,32,99,72,18
116,34,92,32,156,42,816,16,15,218
?
:
:
:
0
65535;将65535假设为最小的奇数
20
:
[]
1;测试是否为奇数
;不是奇数跳过
;记录奇数个数
;奇数与预设的最小奇数比较
;大于预设奇数,跳过
;小于预设奇数,保留
:
2
0;判有无出现过奇数
0;未出现过,把单元清零
:
4C00H
21H
15.一个有符号字数组以0为结束标志,求这个数组的:
最大值、最小值、平均值。
答:
-56,+12,88,-126,-5,16,32,-99,72,-18,0
?
?
?
:
:
:
32767;将32767假设为最小的数
-32768;将-32768假设为最大的数
0;用作累加器,清零
0
:
[]
0
;找到零元素,转结束处理
;纪录非零元素个数
;累加
1
.;比预设最小值还小,保留
1:
2
;比预设最大值还大,保留
2:
2
:
;元素个数为零,转处理
;计算平均值
:
0;元素个数为0,将“最大值”、“最小值”
0;“平均值”清零
0
:
4C00H
21H
16.数组中存有一个班级40名学生的英语课程成绩。
按照0~59,60~74,75~84,85~100统计各分数段人数,存入N0,N1,N2,N3变量内。
答:
40(?
);运行前置入具体数据
N0?
N1?
N2?
N3?
:
:
:
N0,0;各计数器清零
N1,0
N2,0
N3,0
40
:
[]
59;分段测试
L1
L0:
N0
L1:
74
L2
N1
L2:
84
L3
N2
L3:
100
N3
:
2
:
4C00H
21H
17.是一个16个字符组成的字符串,是一个字整数。
编写程序,测试中的每一个字符,如果该字符为数字字符,把中对应位置1,否则置0。
答:
16(?
);运行前置入具体字符
?
:
:
:
0;置为初始状态
16
:
1;右侧空出一位
[]
‘0’;测试是否数字
AL,‘9’
1;将对应位置1
:
:
4C00H
21H
18.编写程序,从键盘上输入一个无符号字整数,用“四进制”格式输出它的值(也就是,每2位二进制看作一位四进制数,使用数字0~3)。
答:
10,0,‘a:
$’
20,0,‘:
$’
:
:
:
1
;输入一个无符号整数
;转存到
2
9
21H;输出前导信息
8
:
1
1;最高2位移到最低位
;转存到
00000011B;保留最低2位
30H;转换成代码
2
21H;输出
4C00H
21H
19.编写程序,把一个30个元素的有符号字数组按照各元素的正负分别送入数组P和M,正数和零元素送P数组,负数送M数组。
答:
30(?
);汇编之前置入数据
P30(?
)
M30(?
)
:
:
:
;数组指针
0;P数组指针
0;M数组指针
30
:
[];从数组取出一个数据
AL
;正数、零转
:
M[],;负数存入M数组
2
:
P[],;正数、零存入P数组
2
:
2
4C00H
21H
20.缓冲区中存放有字符串,以0为结束标志。
编写程序,把字符串中的大写字母转换成小写字母。
答:
‘A.’,0
:
:
:
;缓冲区指针
:
[];从缓冲区取出一个字符
AL,AL
;为零,处理完成
AL,‘A’
‘Z’
AL,‘a’-‘A’
[],
:
:
4C00H
21H
21.编写程序,从键盘上输入无符号字整数X,Y的值,进行的运算,然后按以下格式显示运算结果和运算后对应标志位的状态。
,,,
(其中X为十进制数字,Y为0或1)
答:
:
10,0,‘a:
$’
20,0,‘$’
30,0,‘’
?
‘,’
?
‘,’
?
‘,’
?
0,0,‘$’
:
1
;输入X
1
;输入Y
;求和
;保留标志位状态
2
;输出两个数的和
;标志寄存器内容转存入
AL,‘0’
1000000B;测试
1
AL
1:
ZF,AL
AL,‘0’
100000000000B;测试
2
AL
2:
AL
AL,‘0’
10000000B;测试
3
AL
3:
AL,‘0’
1;测试
4
AL
4:
3
9
21H;输出标志位状态
4C00H
21H
22.编写程序,从键盘上输入一个字符串,统计其中数字字符,小写字母,大写字母,空格的个数并显示。
答:
:
10,0,‘a:
$’
81,?
81(?
)
20,0,‘:
$’
30,0,‘:
$’
40,0,‘:
$’
50,0,‘:
$’
:
1
09H
21H;输出提示信息
0
21H;输入字符串
;各计数器清零
1
0;字符个数送
2;设置字符指针
:
[];取出一个字符
AL,‘‘
L2
L1:
;空格字符计数
L2:
AL,‘0’
AL,‘9’
L4
L3:
;数字字符计数
L4:
AL,‘A’
‘Z’
L6
L5:
;大写字符计数
L6:
AL,‘a’
AL,‘z’
;小写字母计数
:
;循环控制
2
0
;输出数字字符个数
4
0
;输出小写字母个数
3
0
;输出大写字母个数
AL,
0
5
;输出空格个数
4C00H
21H
23.编写程序,读入20个数据,统计每个相同数据出现的次数。
答:
20(?
)
20(?
)
0,0,‘a.$’
:
:
:
20
1
:
;输出提示信息和序号
-1
;输入一项数据
[],;保存成绩
2
LOOP
20
:
[],-1;将“出现次数”初始值设为-1
2
LOOP
0;为被统计数据指针
20
0:
20
0;为其它数据的指针
[];取出被统计数据
1:
[];与其他数据相比较
[];出现相同数据,次数加1
:
2
1;比较下一个数据
2
LOOP0
4C00H
21H
24.编写程序,打印九九乘法表。
答:
:
‘$’;乘积不足两位时补一个空格
:
1;为被乘数
9
0:
9
1;为乘数
1:
-1
10
;乘积不足两位时补一个空格
:
;输出乘积
LOOP1
;结束一行
LOOP0
4C00H
21H
子程序输出时,数据前后各留出一个空格。
程序中对一位数的乘积补上一个空格,这样每个数据共占用4个字符位置,使输出对齐。
25.编写程序,显示1000以内的所有素数。
答:
:
:
2;为被测试的1000以内的整数
0;记录一行上已输出数据个数(每行输出10个素数)
:
1;计算测试范围
2;第一个测试数据
:
;测试完成?
;测试完成,是素数,转
;除法测试
0
;整除,本数据非素数,转
;形成下一个测试数据
;继续测试
:
;统计本行输出数据个数
10
;本行数据未满10个,直接输出
;本行数据已满10个,清计数器
;输出回车换行
-1
;输出一个素数
:
;产生下一个被测试数据
1000
;未完成,继续
;结束一行
4C00H
21H
26.编写程序,输入N,计算:
1*2+2*3+……+
(1)*N
答:
:
10,0,‘N:
$’
20,0,‘$’
:
1
;输入N
;用作累加器
:
;计算J*
(1)
;累加
2
;输出结果
4C00H
21H
27.编写程序,输入N,输出如下矩阵(设5)
11111
22221
33321
44321
54321
答:
设I为行(1~5),J为列(1~5),则(I,J)位置上的数据为:
I>(6)?
I:
6。
:
:
1;为行号
:
5;为6-列号
:
;判断当前位置
:
;下半三角,取6-列号
:
;上半三角,取行号
:
-1
;输出一个数据
COL
;结束本行
;修改行号
5
;未满5行,继续
4C00H
21H
28.根据下面条件,画出每次调用子程序或返回时的堆栈状态。
(1)主程序调用属性的1子程序,返回的偏移地址为1200H.
(2)进入1后调用属性的2子程序,返回的偏移地址为2200H.
(3)进入2后调用属性的3子程序,返回的段基址为4000H,偏移地址为0200H。
(4)从3返回2后。
(5)从2返回1后。