微机原理与接口技术习题答案4.docx
- 文档编号:9024216
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:25
- 大小:26.42KB
微机原理与接口技术习题答案4.docx
《微机原理与接口技术习题答案4.docx》由会员分享,可在线阅读,更多相关《微机原理与接口技术习题答案4.docx(25页珍藏版)》请在冰豆网上搜索。
微机原理与接口技术习题答案4
第4章汇编语言程序设计
1.已知在BUF的起始处保存有N个字符的ASCII码,编写汇编语言程序实现,将这组字符串传送到缓冲区BUFR中,并且使字符串的顺序与原来的顺序相反。
解:
BUFDB"BONJOUR_BELLE"
BUFRDB100DUP(?
)
MOVCX,N
LEASI,BUF
LEADI,BUFR
ADDDI,CX
DECDI
L1:
MOVAL,[SI]
MOV[DI],AL
INCSI
DECDI
LOOPL1
2.利用移位、传送和相加指令实现AX的内容扩大10倍。
解:
将扩大后的结果放在DX:
AX中,注意到10×AX=8×AX+2×AX。
XORDX,DX
SHLAX,1
RCLDX,1
MOVBX,AX
MOVCX,DX
SHLAX,1
RCLDX,1
SHLAX,1
RCLDX,1
ADDAX,BX
ADCDX,CX
3.在缓冲区VAR中连续存放着3个16位的无符号数,编写程序实现将其按递增关系排列;如果VAR中保存的为有符号数,则再编写程序实现将其按递减关系排列。
解:
VARDW1236,-432,3900
XORSI,,SI
MOVAX,VAR[SI]
CMPAX,VAR[SI+2]
JAEL1
XCHGAX,VAR[SI+2]
L1:
CMPAX,VAR[SI+4]
JAEL2
XCHGAX,VAR[SI+4]
L2:
MOVVAR[SI],AX
MOVAX,VAR[SI+2]
CMPAX,VAR[SI+4]
JAEL3
XCHGAX,VAR[SI+4]
L3:
MOVVAR[SI+2],AX
4.编写程序段实现将AL和BL中的每一位依次交叉,得到的16位字保存在DX中,例如(AL)=01100101B,(BL)=11011010B,则得到的(DX)=1011011010011001B。
解:
利用移位指令完成。
XORDX,DX
MOVCX,8
L1:
SHRAL,1
RCRDX,1
SHRBL,1
RCRDX,1
LOOPL1
5.在变量VAR1和VAR2中分别保存有两个字节型的正整数,编写完整的汇编语言程序实现:
(1)当两数中有一个奇数时,将奇数存入VAR1,偶数存入VAR2;
(2)当两数均为奇数时,两个变量的内容不变;
(3)当两数均为偶数时,两数缩小一倍后存入原处。
解:
当VAR1为奇数时,不论VAR2的奇偶性,这两个单元的内容均不变;只有当VAR1为偶数时,如果VAR2为奇数,则VAR1与VAR2内容交换;如果VAR2为偶数,则两数缩小一倍后存入原处。
DATASEGMENT
VAR1DB28
VAR2DB36
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,ES:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVES,AX
MOVAL,VAR1
MOVBL,VAR2
TESTAL,1
JZEVEN1
JMPOVER
EVEN1:
TESTBL,1
JZEVEN2
MOVVAR1,BL
MOVVAR2,AL
JMPOVER
EVEN2:
SHRAL,1
MOVVAR1,AL
SHRBL,1
MOVVAR2,BL
OVER:
MOVAH,4CH
MOVAL,0
INT21H
CODEENDS
ENDSTART
6.已知在字变量VAR1、VAR2和VAR3中保存有3个相同的代码,但有一个错码,编写程序段找出这个错码,并将它送到AX,其地址送SI;如果3个代码都相同,则在AX中置-1标志。
解:
在数据段中定义:
VAR1DW5A34H
VAR2DW5A35H
VAR3DW3A34H
在代码段中编写程序段:
MOVAX,-1
MOVBX,VAR1
CMPBX,VAR2
JZL2
CMPBX,VAR3
JZL1
MOVAX,BX
LEASI,VAR1
JMPOVER
L1:
MOVAX,VAR2
LEASI,VAR2
JMPOVER
L2:
CMPBX,VAR3
JZOVER
MOVAX,VAR3
LEASI,VAR3
OVER:
7.分析下列程序段的功能:
MOVCL,04
SHLDX,CL
MOVBL,AH
SHLAX,CL
SHRBL,CL
ORDL,BL
解:
程序段完成DX:
AX组成的32位无符号数左移4位,低位补零(也即除以16)。
8.下列程序段执行后,求BX寄存器的内容:
MOVCL,3
MOVBX,0B7H
ROLBX,1
RORBX,CL
解:
实际上完成BX内容循环右移2位,因此,BX寄存器的内容为C02DH。
9.下列程序段执行后,求BX寄存器的内容:
MOVCL,5
MOVBX,7D5CH
SHRBX,CL
解:
完成BX内容逻辑右移5位,因此,BX寄存器的内容为03EAH。
10.将BUFFERS中N个字按相反顺序传递到BUFFERT中。
解:
LEASI,BUFFERS
LEADI,BUFFERT
MOVCX,N
ADDDI,N
ADDDI,N
SUBDI,2
L1:
MOVAX,[SI]
MOV[DI],AX
ADDSI,2
SUBDI,2
LOOPL1
11.数组ARRAY中存放有一组字型数据,前两个字节存放数据长度(5的倍数)。
为给这个数组中的数据进行加密保护,每5个数据取出一个数据进行加密处理:
奇数位进行取反,偶数位不变,例如对数据0110110010110001B加密后变成1100011000011011B,编写加密程序encrpytion和解密程序unencrpytion。
解:
约定从第一个数据开始,每5个数据为一组,每组中的第一个数据采取加密/解密处理。
由于加密算法采用的是取反操作,解密算法也采用取反操作,因此解密和解密算法是同一个程序。
ENCRPYTIONPROCNEAR
LEASI,ARRAY
XORDX,DX
MOVAX,[SI]
MOVBX,5
DIVBX
MOVCX,AX
ADDSI,2
L1:
MOVAX,[SI]
XORAX,0AAAAH
MOV[SI],AX
ADDSI,10
LOOPL1
RET
ENCRPYTIONENDP
13.设BUF中存放有N个无符号数(或有符号数),编程实现求它们的最小值(存入AX)和最大值(存入DX)。
解:
BUF存放有N个无符号数的程序如下:
MOVCX,N-1
LEASI,BUF
MOVAX,[SI]
MOVDX,AX
ADDSI,2
L1:
CMPAX,[SI]
JBENOCHG1
XCHGAX,[SI]
NOCHG1:
CMPDX,[SI]
JAENOCHG2
XCHGDX,[SI]
NOCHG2:
ADDSI,2
LOOPL1
如果BUF中存放的是有符号数,则只需要将程序中的两行内容修改:
JBENOCHG1改成:
JLENOCHG1
JAENOCHG2改成:
JGENOCHG2
14.设BUFFER中存放有N个无符号(第1个字节存放缓冲区的长度),编程实现将其中的0元素抹去,并更新其长度。
解:
设BUFFER中存放的是字节型数据。
采用双指针方法:
SI为读指针,DI为写指针,从低地址开始,内存中读出一个字节,如果不为0,则写入内存;如果为0,则不进行写操作。
LEASI,BUFFER
XORCX,CX
MOVCL,[SI]
INCSI
MOVDI,SI
XORBH,BH
XORAL,AL
L1:
CMP[SI],AL
JZL2
MOVBL,[SI]
MOV[DI],BL
INCDI
INCBH
L2:
INCSI
LOOPL1
MOVBUFFER,BH
16.编写一个子程序实现统计AL中1的个数,然后检测出字节型缓冲区BUF中0和1个数相等的元素个数。
解:
统计AL中1的个数,只需将AL右移,移出的一位内容进行累加,子程序为:
COUNTBYTEPROCNEAR
PUSHAX
PUSHCX
MOVCX,8
XORBL,BL
COU1:
SHRAL,1
ADCBL,0
LOOPCOU1
POPCX
POPAX
RET
COUNTBYTEENDP
在此基础上,可以检测出字节型缓冲区BUF中0和1个数相等的元素个数,即一个字节中有4个1。
设BUF中有N个字节型数据,结果保持在BH中。
MOVCX,N
LEASI,BUF
XORBH,BH
L1:
MOVAL,[SI]
CALLCOUNTBYTE
CMPBL,4
JNZL2
INCBH
L2:
INCSI
LOOPL1
19.在缓冲区BUFFER中,第1个字节存放数组的长度(<256),从第2个字节开始存放字符的ASCII码,编写子程序完成在最高位给字符加上偶校验。
解:
STACKSEGMENTSTACK'STACK'
DW100HDUP(?
)
TOPLABELBYTE
STACKENDS
DATASEGMENT
BUFFERDB3;首字节为字符串长度
DB'ABC';字符串
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,ES:
DATA,SS:
STACK
START:
MOVAX,STACK
MOVSS,AX
LEASP,TOP
MOVAX,DATA
MOVDS,AX
MOVES,AX
LEADI,BUFFER
XORCX,CX
MOVCL,[DI]
INCDI
CALLSETEVEN
MOVAH,4CH;返回DOS
MOVAL,0
INT21H
SETEVENPROCNEAR;加偶校验子程序
PUSHAX
PUSHBX
PUSHCX
PUSHDI
SETEVEN1:
MOVAL,[DI]
CALLCOUNTBYTE
ANDBL,01H
JZSETEVEN2
ORAL,80H
MOV[DI],AL
SETEVEN2:
INCDI
LOOPSETEVEN1
POPDI
POPCX
POPBX
POPAX
RET
SETEVENENDP
COUNTBYTEPROCNEAR
PUSHAX
PUSHCX
MOVCX,8
XORBL,BL
COU1:
SHRAL,1
ADCBL,0
LOOPCOU1
POPCX
POPAX
RET
COUNTBYTEENDP
CODEENDS
ENDSTART
20.编写程序完成求多位数(N个字)的绝对值。
21.已知斐波那契数列的定义为:
,编写求该数列前n项的子程序。
解:
设奖斐波那契数列存放在字变量RESULT中。
在数据段中定义
RESULTDW100HDUP(?
)
在代码段中编写子程序
FIBONACCIPROCNEAR
XORDI,DI
MOVRESULT[DI],1;前两个数为1
MOVRESULT[DI+2],1
ADDDI,4
MOVCX,N
L1:
MOVAX,RESULT[DI-4]
ADDAX,RESULT[DI-2]
MOVRESULT[DI],AX
ADDDI,2
LOOPL1
RET
FIBONACCIENDP
22.编写程序实现循环显示10条信息,保存每条信息的变量分别为INFOM1~INFORM10。
解:
在数据段中定义变量:
TABLEDWINFORM1,INFORM2,INFORM3,INFORM4,INFORM5
DWINFORM6,INFORM7,INFORM8,INFORM9,INFORM10
在代码段中编写程序段:
MOVCX,10
XORSI,SI
L1:
MOVDX,TABLE[SI]
MOVAH,9
INT21H
ADDSI,2
CALLWAIT
LOOPL1
这里,WAIT为延时子程序,用于在显示信息之间的停顿。
23.编写程序实现将包含20个数据的数组ARRAY分成两个数组:
正数数组ARRAYP和负数数组ARRAYN,并分别将这两个数组中数据的个数显示出来。
解:
先编写一个子程序DISPALD,完成以3位十进制数形式显示出AL的内容。
DISPALDPROCNEAR
PUSHAX
PUSHCX
PUSHDX
XORAH,AH
MOVCL,100
DIVCL
PUSHAX
MOVDL,30H
ADDDL,AL
MOVAH,2
INT21H
POPAX
MOVAL,AH
XORAH,AH
MOVCL,10
DIVCL
PUSHAX
MOVDL,30H
ADDDL,AL
MOVAH,2
INT21H
POPAX
MOVDL,30H
ADDDL,AH
MOVAH,2
INT21H
POPDX
POPCX
POPAX
RET
DISPALDENDP
在此基础上,根据题目要求,需要用到3个指针:
SI指向源数组ARRAY,DI指向正数数组ARRAYP,BX指向负数数组ARRAYN。
MOVCX,20
XORDX,DX
LEASI,ARRAY
LEADI,ARRAYP
LEABX,ARRAYN
L1:
MOVAL,[SI]
ANDAL,AL
JSL2
MOV[DI],AL
INCDI
INCDL
JMPL3
L2:
MOV[BX],AL
INCBX
INCDH
L3:
INCSI
LOOPL1
MOVAL,DL
CALLDISPALD
MOVAL,DH
CALLDISPALD
24.编写程序实现求缓冲区BUFFER的100个字中的最小偶数(存入AX)。
解:
设BUFFER中存放的是有符号数。
MOVCX,100
LEASI,BUFFER
MOVAX,7FFFH
L1:
ANDWORDPTR[SI],1
JNZL2
CMP[SI],AX
JGEL2
MOVAX,[SI]
L2:
ADDSI,2
LOOPL1
25.编写程序实现求级数
的前n项和刚大于2000的项数n。
解:
BL用于存放项数。
STACKSEGMENTSTACK'STACK'
DW100HDUP(?
)
TOPLABELWORD
STACKENDS
DATASEGMENT
DB100HDUP(?
)
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,ES:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
MOVES,AX
MOVAX,STACK
MOVSS,AX
LEASP,TOP
MOVBL,1
MOVCX,0
COUNT:
MOVAL,BL
MULBL
ADDCX,AX
CMPCX,2000
JAEXIT
INCBL
JMPCOUNT
EXIT:
26.定义一条宏指令,实现将指定数据段的段地址传送到段寄存器ES或DS的功能。
解:
27.定义一条宏指令,实现从键盘中输入一个字符串(利用INT21H的09号功能)。
28.定义一条宏指令,实现在屏幕上输出回车、换行。
29.利用其它指令完成与下列指令一样的功能:
(1)REPMOVSB;
(2)REPLODSB;
(3)REPSTOSB;(4)REPSCASB。
解:
设DF=0
(1)L1:
MOVAL,[SI]
MOVES:
[DI],AL
INCSI
INCDI
LOOPL1
(2)L1:
MOVAL,[SI]
INCSI
LOOPL1
(3)L1:
MOVES:
[DI],AL
INCDI
LOOPL1
(4)L1:
MOVAL,[SI]
CMPAL,ES:
[DI]
INCSI
INCDI
LOOPL1
30.设在数据段中定义了:
STR1DB‘ASSEMBLELANGUAGE’
STR2DB20DUP(?
)
利用字符串指令编写程序段实现:
(1)从左到右将STR1中的字符串传送到STR2;
(2)从右到左将STR1中的字符串传送到STR2;
(3)将STR1中的第6个和第7个字节装入DX;
(4)扫描STR1字符串中有无空格,如有则将第一个空格符的地址传送到SI。
解:
STR1中有17个字符(含一个空格),设DS和ES均指向STR1和STR2所在的段。
(1)CLD
MOVCX,17
LEASI,STR1
LEADI,STR2
REPMOVSB
(2)MOVCX,17
LEASI,STR1
LEADI,STR2
ADDSI,CX
DECSI
L1:
MOVAL,[SI]
MOV[DI],AL
DECSI
INCDI
LOOPL1
(3)LEASI,STR1
MOVDX,[SI+6]
(4)MOVCX,17
LEASI,STR1
MOVAL,20H
L1:
CMP[SI],AL
JZL2
INCSI
LOOPL1
L2:
31.设在数据段中定义了:
STRINGDB‘TodayisSunday&July16,2000’
编写程序实现将STRING中的’&’用’/’代替。
解:
STRING中保存了30个字符。
MOVCX,30
LEASI,STRING
MOVAL,’&’
L1:
CMP[SI],AL
JNZL2
MOVBYTEPTR[SI],’/’
L2:
INCSI
LOOPL1
32.分析下列程序段完成的功能:
MOVCX,100
LEASI,FIRST
LEADI,SECOND
REPMOVSB
解:
将缓冲区FIRST中100个字节传送到SECOND中。
33.分析下列程序段:
LEADI,STRING
MOVCX,200
CLD
MOVAL,20H
REPZSCASB
JNZFOUND
JMPNOT_FOUND
问:
转移到FOUND的条件。
解:
在缓冲区STRING中搜索非空格字符,如果有非空格则转到FOUND,如果200个单元中都是空格,则转到NOT_FOUND。
34.设在数据段的变量OLDS和NEWS中保存有5个字节的字符串,如果OLDS字符串不同于NEWS字符串,则执行NEW_LESS,否则顺序执行程序。
解:
设DS和ES均指向字符串OLDS和NEWS所在的段。
CLD
MOVCX,5
LEASI,OLDS
LEADI,NEWS
REPZCMPSB
JNZNEW_LESS
35.编程实现将STRING字符串中的小写字母变换成大写字母。
解:
设STRING中的字符个数为N。
MOVCX,N
LEASI,STRING
MOVAL,5FH
L1:
AND[SI],AL
INCSI
LOOPL1
36.设在数据段中定义了:
STUDENT_NAMEDB30DUP(?
)
STUDENT_ADDRDB9DUP(?
)
STUDENT_PRINTDB50DUP(?
)
编写程序实现:
用空格符清除缓冲区STUDENT_PRINT;
在STUDENT_ADDR中查找第一个’_’字符;
在STUDENT_ADDR中查找最后一个’_’字符;
如果STUDENT_NAME中全为空格符,则STUDENT_PRINT全存入’*’;
将STUDENT_NAME传送到STUDENT_PRINT的前30个字节中,将STUDENT_ADDR传送到STUDENT_PRINT的后9个字节中。
37.(上机题)编写程序实现,将缓冲区BUFFER中的100个字按递增排序,并按下列格式顺序显示:
数据1<原序号>
数据2<原序号>
……
38.(上机题)按同余法产生一组随机数N(1 90~100,B: 80~89,C: 70~79,D: 66~69,E: 60~65,F: 60分以下),按下列格式显示: Total<总人数> A: <人数1> B: <人数2> C: <人数3> D: <人数4> E: <人数5> F: <人数6> 39.(上机题)编写程序实现下列5项功能,通过从键盘输入1~5进行菜单式选择: (1)按数字键“1”,完成将字符串中的小写字母变换成大写字母。 用户输入由英文大小写字母或数字0~9组成的字符串(以回车结束),变换后按下列格式在屏幕上显示: <原字符串>例如: abcdgyt0092 <新字符串>ABCDGYT0092 按任一键重做;按Esc键返回主菜单。 (2)按数字键“2”,完成在字符串中找最大值。 用户输入由英文大小写字母或数字 0~9组成的字符串(以回车结束),找出最大值后按
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 原理 接口 技术 习题 答案