微机原理作业.docx
《微机原理作业.docx》由会员分享,可在线阅读,更多相关《微机原理作业.docx(22页珍藏版)》请在冰豆网上搜索。
微机原理作业
机械083班微机原理作业
第一章
题1.1A把下列十进制数转换为二进制,十六进制和BCD数;
1.135.6252.548.75
3.376.1254.254.25
题1.1B要求同上,要转换的十进制数如下;
1.67.3752.936.5
268.8754.218.0625
题1.2A写下列十进制数的原码,反码和补码表示(用8位二进制);
1.+652.-115
3.-654.-115
题1.2B要求同题1.2A数据如下;
1.+332.+127
3.-334.-127
题1.3A用16位二进制,写出下列十进制数的原码,反码,和补码表示;
1.+622.-62
3.+2534.-253
5.+6156.-615
题1.4A写出下列用补码表示的二进制数的真直;
1.011011102.01011001
3.100011014.11111001
题1.4B要求同题1.4A数据如下;
1.011100012.00011011
3.100001014.11111110,
第三章汇编语言程序设计题3.1A
在下列程序运行后,给相应的寄存器及存储单元填入运行的结果:
MOVAL,10HM
MOVCX,1000HBL
MOVBX,2000H1000H
MOV[CX],ALBH
XCHGCX,BX
MOVDH,[BX]CL
MOVDL,01H
XCHGCX,BXCL
MOV[BX],DL2000H
HLTDL
题3.1BDL
要求同题3.1A程序如下;
MOVAL,50HAL
MOVBP,1000H
MOVBX,2000H
MOV[BP],AL
MOVDH,20H
MOV[BX],DH
MOVDL,01H
MOVDL,[BX]
MOVCX,3000H
HLT
题3.2,如在自1000H单元开始有一个100个数的数椐块。
要把它传送到自2000H开始的存储区中去,用以下三种方法,分别编制程序;
1;不用数据块转送指令;
2;用单个转送的数据块转送指令;
3;用数据块成组转送指令;
题3.3A利用变址寄存器遍一个程序,把自1000H单元内开始的100个数转送到自1070H开始的存储区中去,
题3.3B要求用3.3A,源地址为2050H,目的地址为2000H,数据块长度为50,
题3.4编一个程序,把自1000H单元开始的100个数转送至1050H开始的存储区中(注意数据区有重叠)。
题3.5A在自0500H单元开始,存有100个数。
要求把它传送到1000H开始的存储区中,但在传送过程中要检查数的值,遇到第一个零就停止传送。
题3.5B条件同题3.5A,但在传送过程中检查数的值,零不传送,不是零则传送至目的区。
题3.6把在题3.5A中指定的数据块中的正数,传送到自1000H开始的存储区。
题3.7把在题3.5A中指定的数据块中的正数,传送到自1000H开始的存储区;而把其中的负数,传送到自1100H开始的存储区。
且分别统计正数和负数的个数,分别存入1200H和1201H单元中。
题3.8A自0500H单元开始,有10个无符号数,编一个程序求10个数的和(用8个位数运算指令),把和放到050A及050B单元中(和用两个字节表示),且高位在050B单元。
题3.8B自0200H单元开始,有100个无符号数,编一个程序求这100个数的和(用8位数运算指令),把和放在0264H和0265H单元(和用两字节表示),且高位在0265H单元。
题3.9题同3.8,只是在累加时用16位运算指令编程序。
题3.10A若在0500H单元中有一个数x:
1.利用加法指令把它乘2,且送回原存储单元(假定x*2后仍为一个字节);
2.x*4;
3.x*10(假定x*10≤255)。
题3.10B
题意与要求同题3.10A,只是x*2后可能为两个字节。
题3.11
若在存储器中有两个数a和b(它们所在地址用符号表示,下同),编一个程序实现a*10+b(a*10以及“和”用两字节表示)。
题3.12
若在存储中有数a,b,c,d(它们连续存放),编一个程序实现
((a*10+b)*10+c)*10+d(和≤65535)
题3.13A
在0100H单元和010AH单元开始,存放两个各为10个字节的BCD数(地址最低处放的是最低字节),求它们的和,且把和放在0114H开始的存储单元中。
题3.13B
在0200H单元和020AH单元开始,存放两个各为10个字节的二进制数(地址最低处放的是最低字节),求它们的和,且把和放在0214H开始的存储单元中。
题3.14
在0200H单元开始放有效A(低位在前)
NA=95437862310456289101
在020单元开始放有数B
NB=78964238154078218450
求两数之差,且把差值送入自0200H开始的存储区。
题3.15A
在0500H单元有一个数x,,把此数的前四位变0,后四位维持不变,送回同一单元。
题3.15B
条件同题3.15A,要求最高位不变,后7位都为0。
题3.16A
若在0500H单元有一个x,把此数的前四位变“1”,后四位维持不变,送回同一单元。
题3.16B
把x的最低位变“1”,高7位不变,送至0600H单元。
题3.17A
若在0500H有一个数X,把此数的前四位变反,后四位维持不变,送回同一个单元
题3.17B
把X最高位去反,后7位不变,送至0600H单元。
题3.18
从0200H单元读入一个数,检查它的符号,且在0300H单元为它建立一个符号标志(正为OO,负为FF)。
题3.19A
若从0200H单元开始有100个数,编一个程序检查这些数,正数保持不变,负数都取补后送回。
题3.19B
把题3.19A中的负数取补后送至0300H单元开始的存储区。
题3.20A
若在0200H和0201H单元中有一个双字节数,编一个程序对它们求补。
题3.20B在BX寄存器对中有一个双字节数,对它求补。
题3.21
若在0200H—0203H单元中有一个四字节数,编一个程序对它求补。
题3.22A
若在0200H—0201H单元中有两个正数,编一个程序比较它们的大小,把大的数放在0201H单元中。
题3.22B
条件同上,把较小的数放在0201H单元中。
题3.23
条件与要求同题3.22A,只是两个数为无符号数。
题3.24
条件与要求同题3.22A,相比较的是两个带符号数。
题3.25A
若自0500H单元开始有1000个带符号数,把它们的最小值找出来,放在1000H单元中。
题3.25B
若自1000H单元开始有1000个无符号数,把它们的最大值找出来,放在2000H单元。
题3.26
若在0200H单元中有一个数X,用移为方法实现
1.X﹡22.X﹡4(X﹡≤255〉
且送回原单元。
题3.27A
编一个程序,使寄存器对BX中的数整个左移一位。
题3.27B
编一个程序,使寄存器对BP中的数整个右移一位(最高位维持不变)。
题3.28A
在0200H单元中有一个数X,利用移位和相加的办法,使X*10(假定X*10≤255)后送回原单元。
题3.28B
条件和要求同题3.28A,但X*10可大于255。
题3.29
在0200H和0201H单元中存有一个两字节数(高位在后),编一个程序把它们整个右移一位。
题3.30
在自BUFFER单元开始,放有一个数据快,BUFFER和BUFFER+1单元中放的是数据的长度,自BUFFER+2开始存放的是ASCII码表示的十进制数码,把它们转换为BCD码,且把两个想邻单元的数码并成一个单元(地址高的放在高四位)。
放到自BUFFER+2开始的存储区中。
题3.31
来自BUFFER单元开始,放有一个数据快,BUFFER和BUFFER+1单元中放的是数据的长度,BUFFER+2开始存放数据,每一单元放的是两位BCD码,把它们分别转换为ASCII,放到自BLOCK开始的存储区中(第四位BCD码转换成的ASCII码放在地址低的单元),而BLOCK和BLOCK+1放转换成的ASCCII码的长度。
题3.32B
条件同题3.32A,把转换以后的两个相邻的16进制树并在一个存储单元中。
题3.33
若在某存储区中已输入4个以ASC11码表示的16进制数码(高位在前),把它们转换为二进制数放入BX寄存器对中。
题3.34
在自BUFFER单元开始的数据块中,前两个单元放的是数据块的长度,自BUFFER+2开始存放的是二进制的数据块。
把每一个存储单元的两位16进制数,分别转换为各自的ASC11码,放到自BLOCK开始的存储区中(开始两个单元放新的数据块的长度)。
题3.35
在题3.30中,把相邻单元的两个数码看成是两位十进制数(后面的为十位数),把它们转换为相应的二进制数,放到自BUFFER+2开始的存储区中。
题3.36
在题3.34中,把数据块中的每一单元的二进制数转换为相应的BCD码(每一字节的二进制数,对应三位BCD码),在把它们转换为ASC11码放到BLOCK开始的存储区中(开始两个单元放新的数据块的长度)。
题3.37
若在AX寄存器中放有四位BCD码把它们转换为相应的二进制数,放在BX寄存器中。
题3.38A
若在BX寄存器中有一个16位无符号数,把它们转换为相应的BCD码,放到自DATA开始的存储区中(每一位BCD码占一个存储单元,高位在前)。
题3.38B
若在BX寄存器中有一个16位带符号数,把它们转换为相应的BCD码,放在自DATA开始的存储区中(符号占一个单元,每一位BCD码占一个存储单元,高位在前)。
题3.39
若自STRING单元开始存放一个字符串(以字符$结尾):
1.编一个程序统计这个字符串的长度(不包括$字符);
2.把字符串的长度,放在STRING单元,把整个字符串往下移两个存储单元。
题3.40
若自STRING单元开始存放一个字符串(一字符空格引导,以$结尾),编一个程序统计这个字符串的长度(忽略前导空格和结尾的$字符)。
题3.41A
在题3.40的字符串中,统计数字字符(‘0’-‘9’)的个数。
题3.41B
在题3.40的字符串中,统计16进位字符(既‘0’-‘9’,‘A’-‘F’)的个数。
题3.42A
在题3.40的字符串中,把十进制数字字符(‘0’-‘9’)传送至DATA开始的存储区中,在DATA和DATA+1单元存放的是这个数字字符串的长度,自DATA+2单元开始存放字符。
题3.42B
条件和要求同题3.42A,只是传送的是16进制数字字符。
题3.43
在自STRI1和STRI2开始各有一个由10个字符串,检查这两个字符串是否相等,在STFLAG单元中建立一个标志(相等为00,不等为FF)。
题3.44A
编一个程序,统计一个八位二进制数中的为“1”的位的个数。
题3.44B
编一个程序,统计一个16位二进制数中的为“1”的位的个数。
题3.45
在自STRI1开始有一个字符串(前两个字节为字符串长度),对每一个字符配上偶检验位,送回原处。
(以下各题所编的程序必须包含必要的伪指令)
题3.46
字NUMBER单元开始放有两个多字节得用BCD码表示的十进制数,NUMBER单元放的是字节数,NUMBER+1开始连续存放两个多字节数(高位在后),编一个程序把这个多字节数相加,和接着原来的数连续存放。
题3.47A
编一个程序,使放在DATA及DATA+1单元的两个八位带符号数相乘,乘积放在DATA+2及DATA+3单元中(高位在后)。
题3.47B
编一个程序,使放在DATA(被除数)及DATA+1(除数)两个八位带符号数相除,商放在DATA+2单元,余数放在DATA+3单元中。
题3.48A
编一个程序,使放在DATA及DATA+1的两字节无符号数与在DATA+2及DATA+3中的无符号数相乘,乘积接着原来的数存放(高位在后)。
题3.48B
编一个24位无符号数相乘的函数。
题3.49
编一个程序,使上题中的两个16位无符号数相除,商和余数接着原来的数存放(先放商,高位在后)。
题3.50
在题3.48中,相乘的是两个16位带符号数,计算成绩。
题3.51
若在自DATA开始的7个单元中,第一个单元放数的符号(用ASC11码表示),接着最多为5位用ASC11码表示的十进制数码(高位在前),且数值在±32768范围内,然后是非数字字符(表示数的结束)。
编一个程序,把它转换为相应的16位二进制数(用补码表示),放在BX寄存器中。
题3.52
把在BX寄存器对中的16位带符号二进制数,且把符号位及各位十进制码转换为相应的ASCII码,放到自DATA开始的7个存储单元中(高位在前),最后填以空格。
题3.53
若自STRING开始有一个字符串(以‘#’号作为字符串的结束标志),编一个程序,查找此字符串中有没有字符$,有多少个$(放在NUMBER单元中,没有$则其为0,佛则既为$的个数);且把每一个$字符所存放的地址,放到自POINTR开始的连续的存储单元中。
题3.54A
某一个监控程序中,有10个命令,分别以字母A,B,C,D,E,F,G,H,I,J表示。
这10个命令有10个处理程序,它们的入口地址形成一个表格CMDTBL。
3000CMDTBL
30003500;A命令入口
30023550;B命令入口
30043600;C命令入口
30063640;D命令入口
30083670;E命令入口
300A36B0;F命令入口
300C3700;G命令入口
300E3730;H命令入口
30103760;I命令入口
301237A0;J命令入口
若打入的命令字已在累加器A中,编一个程序,根据输入的命令字转至相应的处理程序。
题3.54B
条件同题3054A,只是有一个转移指令表,如下所示:
3000CMDJPT
3000JP3500;转至A命令处理程序入口
3003JP3550;转至B命令处理程序入口
3006JP3600;转至C命令处理程序入口
3009JP3640;转至D命令处理程序入口
300CJP3670;转至E命令处理程序入口
300FJP36B0;转至F命令处理程序入口
3012JP3700;转至G命令处理程序入口;
3015JP3730;转至H命令处理程序入口
3018JP3760;转至I命令处理程序入口
301BJP37A0;转至J命令处理程序入口
要求同题3.54A
题3.55A
某一个操作系统有6个内部命令,把这6个内部命令及响应的处理程序的入口地址,组成一个内部命令表INCMDT,如下所示:
ORG2000H
INCMDT:
DBATRIB
DB00
DW2020
DB‘BYE’
题3.56
再自TAOCK开始的存储区中有1000个带符号数。
用气泡排序法编一个程序,使它们排列有序。
题3.57A
在自TABLE开始的存储区中有一个有序排列(带符号数,大的在后面)的数据块,其中TABLE及TABLE+1中存放数据块长度N(可以大于255)若要搜素的关键字已输入至累加器A中。
编一个程序用对分搜索法搜素此关键字,在程序中建立一个标志,表示是否有此关键字。
题3.57B
条件及要求同题3.57A只是已有序排列的数据块是大的数据在前面(地址低处)
题3.58
把数据块传送程序遍为一个子程序MOVE,原地址,目的地址和传送的字节数放在自ADDR开始的存储单元中。
题3.59A
把八位无符号数乘法程序编为一个子程序,被乘数,乘数和乘积放在自DATA开始的存储单元中。
题3.59B
把八位无符号数除法程序编为一个子程序,被除数,除数,商和余数放在自DATA开始的存储单元中。
题3.60
写一个宏定义,使8088的8位寄存器之间的数据能实现任意传送。
题3.61
写一个宏定义,使8088的16位寄存器的数据互换。
题3.62A
写一个宏定义,能把任一个寄存器的最高位移至另一个寄存器的最低位中。
题3.62B
写一个宏定义,能把任一个内存单元中的最高位移至另一个内存单元中的最低位中。
题3.63A
写一个宏定义,能把任一个寄存器的最低位移至另一个寄存器的最高位中。
题3.63B
写一个宏定义,能把任一个内存单元中的最低位移至另一个内存单元中的最高位中。
题3.64
用宏定义写一个数据块传送指令。
题3.65
写一个宏定义,能使任一个寄存器对向左或向右移位指定的次数。
实验第三节调试程序DEBUG
一,PC—DOS的提示符A>下,可打入如下命令;
A>DEBUG[d:
][Path[filename[.ext]][Parm1][Pram2]
其中,DEBUG是调试程序的文件名;后面是要调试的程序的文件标识符。
若在命令中规定了文件标识符,则在DOS把DEBUG程序调入内存后,DEBUG程序把要调试的程序(根据文件标识符)调入内存.如在命令中没有规定文件标识符,则DEBUG程序或者与正在内存中的内容打交道;或可以用Name和Load命令,从盘上输入要调试的程序。
命令行中的[Parm1(叁数1)][Parm2(叁数2)],我们在后面结合具体的命令加以介绍。
在DEBUG程序调入后,发出提示符一。
说明现在系统在DEBUG程序的管理之下。
所有的DEBUG命令,也只有在出现提示符后才有效。
二,DEBUG程序对寄存器和标志位的初始化
在DEBUG程序启动后,它把各个寄存器和标志位,置成以下状态:
1.段寄存器(CS,DS,ES和SS)置于自由存储空间的底部,也就是DEBUG程序结束以后的第一个段。
2.指令指针(IP)置为`0100`。
3.指针置到段的结尾处,或者是装入程序的临时底部,取决于那一个更底。
4.余下的寄存器(AX,BX,CX,DX,BP,SI,和DI)置未0。
然而,若调用DEBUG时包含一个要调试的程序的文件标识符,则CX中包含以字节表示的文字长度。
若文件大于64K,则文件长度包含在BX和CX中(高的部分在BX中)。
5.标志为都置位清除状态。
6.Default的磁盘暖冲区置于码段的X“80”。
注:
若有DEBUG调入的程序,具有扩展名EXE,则DEBUG必须进行再分配,把段寄存器,堆钱指针,指令指针置为文件中所规定的值。
三,有关DEBUG命令的一些共同信息
1.DEBUG命令都是一个字母,后面跟由一个或多个参数。
2.命令和参数可以用大写或小写或混合方式输入。
3.命令和参数间,可以用定界符分隔。
然而定界符只是在两邻接的十六进制值之间是必需的。
因此,谢列命令是等效的:
dcs:
100110
dcs:
100110
d,cs:
100,110
4.可以用按Ctrl-Break键来停止一个命令的执行,返回DEBUG提示符。
5.每个命令,只有再按了Enter键以后才有效,才开始执行。
6.若一个命令产生相当大数量的输出行,为了能在屏幕上当一行卷走以前读清楚它,可以在显示过程中按Ctrl-NumLock键,以暂定上卷,ji可以按任何一个字符来重新启动。
7.若DEBUG检查出一个语法错误,则显示具有错误的行和知识错误所在。
例如:
Dcs:
100cs:
110
error
四,显示内存单元内容的命令(DumpCommand)
为了了解程序执行的结果,检查内存单元的内容是十分重要的。
此命令能检查指定范围的存储单元的内容。
命令的格式为:
D[地址]或D[范围]
其中,D是命令字母,[地址]或[范围]都是为了指定要显示的存储单元的范围。
存储单元的内容,用两种方式显示:
一种是每一个存储单元的内容(每一字节)用两位十六进制数显示;另一种是用相应的ASCII字符显示。
显示有两种格式,若是40列系统显示格式,每一行开始在8个字节的界限上显示8个字节;若是80列系统显示格式,每一行开始在16个字节的界限上显示16个字节。
显示命令有两种常用的格式:
1.格式为D地址
或D则从指定地址开始,显示40H个字母(相应于系统地40列显示格式),或80H个字节(相应于80列显示格式)。
若命令中没有指定起始地址,则从上一个D命令所显示的最后一个单元的下一个单元开始。
若以前没有使用过D命令,则从由DEBUG初始化的段寄存器的内容,加上地址位移量0100H作为起始地址。
若在命令中所打入的地址中,只包含起始地址的位移量,则D命令认为端的只包含在DS中。
例如:
-d100
08F8:
010000236798560AA3A8-F6FFD5D3E4DFBE00.#.V.#.
08F8:
011001BB0002B90E00AC-493A047F028A0446.:
..9..,I:
…….F
08F8:
0120E2.F78807F4000000-000000000000000000bw..t…………..
08F8:
01300000000000000000-000000000000000000………………..
08F8:
01400000000000000000-000000000000000000………………..
08F8:
01500000000000000000-000000000000000000………………..
08F8:
01600000000000000000-000000000000000000………………..
08F8:
01700000000000000000-000000000000000000………………..
2.显示指定范围的内容
D范围
在范围中包含起始地址和结束地址。
若输入的起始地址中,为包含段地址部分,则D命令认为段地址在DS中,而输入的结尾地址中,只允许有地址位移量。
例如:
-dds:
01000200
07B5:
0100B8C8C8078ED88EC0B8-CE078ED0B864008B8H..X.§8N..P8d..
07B5:
0110E0BB0000BF3000FC-BE00008A00AA8A40‘;..?
0.0>….*.§
07B5:
012010AA8A4020AA4683-FE1076