微机原理与接口技术习题答案41.docx

上传人:b****3 文档编号:11033661 上传时间:2023-05-28 格式:DOCX 页数:25 大小:26.41KB
下载 相关 举报
微机原理与接口技术习题答案41.docx_第1页
第1页 / 共25页
微机原理与接口技术习题答案41.docx_第2页
第2页 / 共25页
微机原理与接口技术习题答案41.docx_第3页
第3页 / 共25页
微机原理与接口技术习题答案41.docx_第4页
第4页 / 共25页
微机原理与接口技术习题答案41.docx_第5页
第5页 / 共25页
微机原理与接口技术习题答案41.docx_第6页
第6页 / 共25页
微机原理与接口技术习题答案41.docx_第7页
第7页 / 共25页
微机原理与接口技术习题答案41.docx_第8页
第8页 / 共25页
微机原理与接口技术习题答案41.docx_第9页
第9页 / 共25页
微机原理与接口技术习题答案41.docx_第10页
第10页 / 共25页
微机原理与接口技术习题答案41.docx_第11页
第11页 / 共25页
微机原理与接口技术习题答案41.docx_第12页
第12页 / 共25页
微机原理与接口技术习题答案41.docx_第13页
第13页 / 共25页
微机原理与接口技术习题答案41.docx_第14页
第14页 / 共25页
微机原理与接口技术习题答案41.docx_第15页
第15页 / 共25页
微机原理与接口技术习题答案41.docx_第16页
第16页 / 共25页
微机原理与接口技术习题答案41.docx_第17页
第17页 / 共25页
微机原理与接口技术习题答案41.docx_第18页
第18页 / 共25页
微机原理与接口技术习题答案41.docx_第19页
第19页 / 共25页
微机原理与接口技术习题答案41.docx_第20页
第20页 / 共25页
亲,该文档总共25页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

微机原理与接口技术习题答案41.docx

《微机原理与接口技术习题答案41.docx》由会员分享,可在线阅读,更多相关《微机原理与接口技术习题答案41.docx(25页珍藏版)》请在冰点文库上搜索。

微机原理与接口技术习题答案41.docx

微机原理与接口技术习题答案41

第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组成的字符串(以回车结束),找出最大值后

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2