汇编语言程序设计课后习题解答.docx

上传人:b****4 文档编号:27025356 上传时间:2023-06-25 格式:DOCX 页数:135 大小:110.43KB
下载 相关 举报
汇编语言程序设计课后习题解答.docx_第1页
第1页 / 共135页
汇编语言程序设计课后习题解答.docx_第2页
第2页 / 共135页
汇编语言程序设计课后习题解答.docx_第3页
第3页 / 共135页
汇编语言程序设计课后习题解答.docx_第4页
第4页 / 共135页
汇编语言程序设计课后习题解答.docx_第5页
第5页 / 共135页
点击查看更多>>
下载资源
资源描述

汇编语言程序设计课后习题解答.docx

《汇编语言程序设计课后习题解答.docx》由会员分享,可在线阅读,更多相关《汇编语言程序设计课后习题解答.docx(135页珍藏版)》请在冰豆网上搜索。

汇编语言程序设计课后习题解答.docx

汇编语言程序设计课后习题解答

《汇编语言程序设计》(宋人杰主编)课后习题解答

第1章汇编语言基础知识

1.简述汇编语言源程序、汇编程序、和目标程序的关系。

答:

用汇编语言编写的程序称为汇编源程序;汇编源程序在汇编程序的翻译下转换成计算机语言变成目标程序。

2.简述汇编语言的优缺点。

答:

(1)汇编语言的优点:

①可有效地访问、控制计算机各种硬件设备,如磁盘、存储器、CPU、I/O端口等。

.

②目标代码简短,占用内存少,执行速度快,是高效的程序设计语言。

③可与高级语言配合使用,应用十分广泛。

(2)汇编语言的缺点:

①通用性和可移植性较差

②相对于高级语言来说较繁锁、易出错、不够直观。

3.CPU的寻址能力为8KB,那么它的地址总线的宽度为多少?

答:

13

4.1KB的存储器有多少个存储单元?

答:

1024个字节。

5.指令中的逻辑地址由哪两部分组成?

答:

指令中的逻辑地址由段基址和偏移量组成。

6.以下为用段基址:

偏移量形式表示的内存地址,试计算它们的物理地址。

(1)12F8:

0100

(2)1A2F:

0103(3)1A3F:

0003(4)1A3F:

A1FF

答:

(1)13080H

(2)1A3F3H

(3)1A3F3H

(4)245EFH

7.自12FA:

0000开始的内存单元中存放以下数据(用十六进制形式表示):

030611A31301,试分别写出12FA:

0002的字节型数据、字型数据及双字型数据的值。

答:

字节型数据:

11H

字型数据:

0A311H

双字型数据:

0113A311H

8.内存中某单元的物理地址是19318H,段基地址为1916H,则段内偏移地址为多少?

若段内偏移地址为2228H,则段基地址为多少?

答:

若段基地址为1916H,则段内偏移地址为01B8H;若段内偏移地址为2228H,则段基地址为170FH

9.在实模式环境中,一个段最长不能超过多少字节?

答:

64KB

10.实模式可寻址的内存范围是多少?

答:

1MB

 

第2章汇编语言源程序格式

1.请解释变量和标号的含义,两者有何区别?

答:

标号代表一条指令所在单元的地址,在代码段中定义;变量是存放数据的存储单元的地址符号名,在除代码段以外的其他段中定义。

变量和标号的主要区别在于变量指的是数据,而标号则对应的是指令。

2.变量和标号有什么属性?

答:

都具有三种属性:

段属性、偏移属性和类型属性

3.伪指令语句与指令语句的区别是什么?

伪指令有什么用途?

答:

伪指令并不像指令语句那样在程序运行期间由计算机自动执行,而是在汇编程序对源程序汇编期间由汇编程序处理的操作。

伪指令可以完成如处理器选择、定义程序模块、数据定义、存储区分配、指示程序开始和结束等功能。

4.数值返回运算符有哪几种?

简述LENGTH和SIZE的区别。

答:

⑴数值返回运算符包括:

SEG(取段地址)、OFFSET(取偏移地址)、TYPE(取类型值)、LENGTH(取长度)、SIZE(取总字节数)。

⑵对于变量中使用DUP的情况,LENGTH回送分配给该变量的单元数,对于其他情况则送1;而SIZE会送分配给变量的总字节数,也就是LENGTH和TYPE的乘积。

5.画图说明下列伪指令所定义的数据在内存中的存放形式。

(1)ARR1DB6,34H,-7

(2)ARR2DW3C5DH,1,?

(3)ARR3DB2DUP(1,2,DUP(2,5),3)

(4)ARR4DB‘HELLO’

(5)ARR%DB‘1234’

(2)见

(3)见

(4)见

(5)

6.写出下列变量定义语句。

(1)为缓冲区BUF1预留20B的存储空间。

(2)将字符串‘ABCD’,‘1234’存放于BUF2存储区中。

答:

(1)BUF1DB20DUP(?

(2)BUF2DB‘ABCD’

DB‘1234’

7.符号定义语句如下:

BUFDB2,3,4,5,‘345’

EBUFDB8

LTDBEQUEBUF-BUF

问LT的值是多少?

答:

LT的值为7

8.假设程序中的数据定义如下:

ADW?

BDB16DUP(?

CDD?

TEQU$-A

问T的值是多少?

它表示什么意义?

答:

T的值是22;它表示从变量A到T之间分配的存储空间(字节)数目。

9.如何规定一个程序执行的开始位置?

主程序执行结束应该如何返回DOS?

源程序在何处停止汇编过程?

答:

程序开始位置:

END伪指令后的标号所对应的地址;应用程序开始伪指令.STARTUP处。

返回DOS:

RET指令结合PUSHDS等指令;用DOS功能调用的第4CH号中断;.EXIT伪指令。

END伪指令处停止汇编过程。

10.EQU伪指令与“=”伪指令有何区别?

答:

在同一程序中,“=”伪指令可对一个符号重复定义

11.指出下列伪指令表达方式的错误,并改正之。

(1)DATASEG

(2)SEGMENT‘CODE’

(3)MYDATASEGMENT

DATAENDS

(4)MAINPROCFAR

ENDMAIN

MAINENDP

答:

(1)SEG改为SEGMENT

(2)没有段名

(3)DATAENDS改为MYDATAENDS

(4)ENDMAIN删除

第3章8086/8088寻址方式及指令系统

1.什么是寻址方式,8086/8088微处理器有几种寻址方式,各类寻址方式的基本特征是什么?

答:

寻址方式就是寻找指令中操作数的方式,或寻找指令转移目的地址的方式。

8086/8088微处理器的寻址方式分为数据寻址方式和程序转移寻址方式。

数据寻址方式主要包括立即数寻址方式、寄存器寻址方式、直接寻址方式、寄存器间接寻址方式、寄存器相对寻址方式、基址变址寻址方式和相对基址变址寻址方式;程序转移寻址方式主要包括段内直接寻址、段内间接寻址、段间直接寻址、段间间接寻址。

立即数寻址:

操作数就在指令中,作为指令的一部分,跟在操作码后存放在代码段。

寄存器寻址:

操作数在寄存器中,指令中指定寄存器号。

直接寻址方式:

操作数在存储器中,指令直接包含操作数的有效地址EA。

寄存器间接寻址:

操作数在存储器中,操作数的有效地址在SI,DI,BX,BP这4个寄存器之一中。

寄存器相对寻址:

操作数在存储器中,操作数的有效地址是一个基址寄存器(BX,BP)或变址寄存器(SI,DI)的内容加上8位或16位的位移之和。

基址变址寻址:

操作数在存储器中,操作数的有效地址是一个基址寄存器(BX,BP)加上变址寄存器(SI,DI)的内容。

相对基址变址寻址:

操作数在存储器中,操作数的有效地址是一个基址寄存器(BX,BP)和变址寄存器(SI,DI)的内容加上8位或16位的位移之和。

段内直接寻址:

转向的有效地址是当前IP寄存器的内容和指令中指定的8位或16位位移量之和。

段内间接寻址:

转向的有效地址是一个寄存器或是一个存储单元的内容。

段间直接寻址:

在指令中直接提供了转向段地址和偏移地址。

段间间接寻址:

用存储器里的两个相继字的内容来取代IP和CS寄存器中的原始内容,以达到段间转移的目的。

2.假定(DS)=1000H,(SI)=007FH,(BX)=0040H,(BP)=0016H,变量TABLE的偏移地址为0100H,试指出下列指令的源操作数字段的寻址方式,它的有效地址(EA)和物理地址(PA)分别是多少?

(1)MOVAX,[1234H]

(2)MOVAX,TABLE

(3)MOVAX,[BX+100H](4)MOVAX,TABLE[BP][SI]

答:

(1)直接寻址,EA=1234H,PA=11234H

(2)直接寻址,EA=0100H,PA=10100H

(3)寄存器相对寻址,EA=0140H,PA=10140H(4)相对基址变址寻址,EA=0195H,PA=10195H

3.若TABLE为数据段0032单元的符号名,其中存放的内容为1234H,试问下列两条指令有什么区别?

执行完指令后,AX寄存器的内容是什么?

MOVAX,TABLE

LEAAX,TABLE

答:

第一条指令是取0032单元的内容,执行完后AX的内容是1234H

第二条指令是取TABLE的偏移地址,执行完后AX的内容为0032H

4.指出下列指令的错误。

(1)MOVCX,DL

(2)MOVIP,AX

(3)MOVES,1234H

(4)MOVES,DS

(5)MOVAL,300H

(6)MOV[SP],AX

(7)MOVAX,BX+DI

(8)MOV20H,AH

答:

(1)两操作数长度不一致

(2)目的操作数不能为IP

(3)立即数不能直接送段寄存器

(4)两个段寄存器之间不能直接进行数据传送

(5)两操作数长度不一致

(6)SP不能用作间址寄存器

(7)BX+DI改为[BX][DI]或[BX+DI]

(8)目的操作数不能为立即数

5.指出下列指令的错误。

(1)POPCS

(2)SUB[SI],[DI]

(3)PUSHAH

(4)ADCAX,DS

(5)XCHG[SI],30H

(6)OUTDX,AH

(7)INAL,3FCH

(8)MUL5

答:

(1)POP指令不允许使用CS

(2)两操作数不能同时是存储器寻址方式

(3)堆栈的操作必须以字为单位

(4)段寄存器不允许直接参加运算

(5)XCHG指令的操作数不允许是立即数

(6)OUT指令只能用AL做源操作数

(7)端口号大于255,必须将其放到DX中

(8)MUL指令源操作数不允许是立即数

6.请分别用一条汇编语言指令完成如下功能。

(1)把BX寄存器和DX寄存器的内容相加,结果存入DX寄存器。

(2)用寄存器BX和SI的基址变址寻址方式把存储器的一个字节与AL寄存器的内容相加,并把结果送到AL中。

(3)用BX和位移量0B2H的寄存器相对寻址方式把存储器中的一个字和CX寄存器的内容相加,并把结果送回存储器中。

(4)把数0A0H与AL寄存器的内容相加,并把结果送回AL中。

答:

(1)ADDDX,BX

(2)ADDAL,[BX+SI]

(3)ADD[BX+0B2H],CX

(4)ADDAL,0A0H

7.求出以下各十六进制数与十六进制数58B0之和,并根据结果设置标志位SF、ZF、CF和OF的值。

(1)1234H

(2)5678H

(3)0AF50H

(4)9B7EH

答:

(1)和为6AE4H,SF=0,ZF=0,CF=0,OF=0

(2)和为0AF28H,SF=1,ZF=0,CF=0,OF=1

(3)和为0800H,SF=0,ZF=0,CF=1,OF=0

(4)和为0F42EH,SF=1,ZF=0,CF=0,OF=0

8.执行指令ADDAL,72H前,(AL)=8EH,标志寄存器的状态标志OF、SF、ZF、AF、PF和CF全为0,指出该指令执行后标志寄存器的值。

答:

指令执行后,AL的内容为0000000H,且有进位,标志寄存器中各标志位的值为:

OF=0,SF=0,ZF=1,AF=1,PF=1,CF=1

9.已知程序段如下:

MOVAX,1234H

MOVCL,4

ROLAX,CL

DECAX

MOVCX,4

MULCX

试问:

1、每条指令执行完后,AX的内容是什么?

2、每条指令执行完后,CF、SF和ZF的值是什么?

3、程序执行完后,AX和DX的内容是什么?

答:

(1)

(2)

MOVAX,1234H;(AX)=1234H,各标志位不变

MOVCL,4;(AX)=1234H,各标志位不变

ROLAX,CL;(AX)=2341H,CF=1,其它标志位不变

DECAX;(AX)=2340H,CF不变,SF=0,ZF=0

MOVCX,4;(AX)=2340H,各标志位不变

MULCX;(AX)=8D00H,CF=0,ZF=0,SF=0

(3)程序执行完后,(AX)=8D00H,(DX)=0000H

10.编程序段,将AL、BL、CL、DL相加,结果存在DX中。

答:

MOVAH,0

ADDAL,BL

ADCAH,0

ADDAL,CL

ADCAH,0

ADDAL,DL

ADCAH,0

MOVDX,AX

11.编程序段,从AX中减去DI,SI和BP中的数据,结果送BX。

答:

SUBAX,DI

SUBAX,SI

SUBAX,BP

MOVBX,AX

12.假设(BX)=0E3H,变量VALUE中存放的内容为79H,确定下列各指令单独执行后的结果。

(1)ORBX,VALUE

(2)ANDBX,VALUE

(3)XORBX,OFFH

(4)ANDBX,01H

(5)TESTBX,05H

(6)XORBX,VALUE

答:

(1)(BX)=0FBH

(2)(BX)=61H

(3)(BX)=1CH

(4)(BX)=01H

(5)(BX)=0E3H

(6)(BX)=9AH

13.已知数据段500H~600H处存放了一个字符串,说明下列程序段执行后的结果。

MOVSI,600H

MOVDI,601H

MOVAX,DS

MOVES,AX

MOVCX,256

STD

REPMOVSB

答:

将数据段501H~600H中存储的字符串移到数据段502~601H中

14.说明下列程序段的功能。

CLD

MOVAX,0FEFH

MOVCX,5

MOVBX,3000H

MOVES,BX

MOVDI,2000H

REPSTOSW

答:

将附加段的32000H开始的连续5个字初始化为0FEFH

15.判断下列程序段跳转的条件。

(1)XORAX,1E1EH

JEEQUAL

(2)TESTAL,10000001B

JNZTHERE

(3)CMPCX,64H

JBTHERE

答:

(1)AX中的值为1E1EH时会跳转

(2)AL的最低和最高位至少有一位为1时发生跳转

(3)CX中的值小于64H时发生跳转

16.选取正确指令,完成以下任务。

(1)右移DI三位,并将0移入最左一位。

(2)AL内容左移一位,0移入最后一位。

(3)DX寄存器右移一位,并且使结果的符号位与原符号位相同。

答:

(1)MOVCL,3

SHRDI,CL

(2)SHLAL,1(3)SARDX,1

17.假设AX和SI存放的是有符号数,DX和DI存放的是无符号数,请用比较指令和条件转移指令实现以下判断。

(1)若DX>DI,转到ABOVE执行

(2)若AX>SI,转到GREATER执行。

(3)若CX=0,转到ZERO执行(4)若AX-SI产生溢出,转到OVERFLOW执行。

(5)若SI≤AX,转到LESS_EQ执行。

(6)若DI≤DX,转到BELOW_EQ执行。

答:

(1)CMPDX,DI

JAABOVE

(2)CMPAX,SI

JGGREATER

(3)CMPCX,0

JEZERO

(4)CMPAX,SI

JOOVERFLOW

(5)CMPAX,SI

JGELESS_EQ

(6)CMPDX,DI

JAEBELOW_EQ

18.有一个首地址为ARRAY的20个字数组,说明下列程序段的功能。

MOVCX,20

MOVAX,0

MOVSI,AX

SUM_LOOP:

ADDAX,ARRAY[SI]

ADDSI,2

LOOPSUM_LOOP

MOVTOTAL,AX

答:

将首地址为ARRAY的20个字数组元素求和,将结果存放到TOTAL单元

22.已知内存中起始地址为BLOCK的数据块(字节数为COUNT)的字节数据有正有负。

试编写一个程序,将其中的正、负分开,分别送至同一段中的两个缓冲区,设正、负缓冲区的首地址分别为PLUS和MINUS。

答:

DATASEGMENT

BLOCKDB16DUP(?

PLUSDB16DUP(?

MINUSDB16DUP(?

DATAENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

START:

MOVAX,DATA

MOVDS,AX

MOVSI,OFFSETBLOCK

MOVDI,OFFSETPLUS

MOVBX,OFFSETMINUS

MOVCX,COUNT

NEXT:

MOVAL,[SI]

TESTAL,80H

JNZMD

MOV[DI],AL

INCDI

JMPAGAIN

MD:

MOV[BX],AL

INCBX

AGAIN:

INCSI

LOOPNEXT

MOVAH,4CH

INT21H

CODEENDS

ENDSTART

 

19.按照下列要求,编写相应的程序段。

(1)已知字符串STRING包含有32KB内容,将其中的“$”符号替换成空格。

(2)有一个100个字节元素的数组,其首地址为ARRAY,将每个元素减1(不考虑溢出)存于原处。

(3)统计以“$”结尾的字符串STRING的字符个数

(4)假设从B800H:

0开始存放有16个16位无符号数,编程求它们的和,并把32位的和保存在DX、AX中。

答:

(1)

MOVSI,0

MOVCX,8000H

AGAIN:

CMPSTRING[SI],’$’

JNZNEXT

MOVSTRING[SI],20H

NEXT:

INCSI

LOOPAGAIN

(2)

MOVSI,0

MOVCX,100

AGAIN:

DECARRAY[SI]

INCSI

LOOPAGAIN

(3)

XORSI,SI

COMP:

CMPSTRING[SI],’$’

JEOVER

INCSI

JMPCOMP

OVER:

RET

(4)

MOVAX,0B800H

MOVDS,AX

XORSI,SI

XORDX,DX

MOVCX,0FH

MOVAX,[SI]

AGAIN:

INCSI

INCSI

ADDAX,[SI]

JNCNEXT

INCDX

NEXT:

LOOPAGAIN

RET

20.编写程序,把ARRAY1和ARRAY2中20个字节数分别相加,结果放到TABLE中。

(1)假定数据为无符号数,如果结果大于255则结果为255。

(2)假定结果为带符号数,如果有溢出则保存结果为0。

答:

(1)

DATASEGMENT

ARRAY1DB20DUP(?

ARRAY2DB20DUP(?

TABLEDB20DUP(?

DATAENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

START:

MOVAX,DATA

MOVDS,AX

MOVCX,20

MOVSI,0

AGAIN:

MOVAL,ARRAY1[SI]

ADDAL,ARRAY2[SI]

JCLABEL1

MOVTABLE[SI],AL

JMPLABEL2

LABEL1:

MOVTABLE[SI],255

LABEL2:

INCSI

LOOPAGAIN

MOVAH,4CH

INT21H

CODEENDS

ENDSTART

(2)

DATASEGMENT

ARRAY1DB20DUP(?

ARRAY2DB20DUP(?

TABLEDB20DUP(?

DATAENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

START:

MOVAX,DATA

MOVDS,AX

MOVCX,20

MOVSI,0

AGAIN:

MOVAL,ARRAY1[SI]

ADDAL,ARRAY2[SI]

JOLABEL1

MOVTABLE[SI],AL

JMPLABEL2

LABEL1:

MOVTABLE[SI],0

LABEL2:

INCSI

LOOPAGAIN

MOVAH,4CH

INT21H

CODEENDS

ENDSTART

21.字符串ATR1保存着100个字节的ASCII码,试编写一个程序统计该字符串中空格(20H)的个数。

答:

DATASEGMENT

ATR1DB100DUP(?

DATAENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

START:

MOVAX,DATA

MOVDS,AX

MOVCX,100

XORDI,DI

XORSI,SI

COMP:

CMPATR1[SI],20H

INCSI

JNENEXT

INCDI

NEXT:

LOOPCOMP

MOVAH,4CH

INT21H

CODEENDS

ENDSTART

第4章顺序、分支与循环程序设计

1.试编写一个程序实现将从键盘输入的小写字母用大写字母形式显示出来。

答:

DATASEGMENT

STRMESSAGEDB“请输入小写字符”,0DH,0AH,’$’

DATAENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

START:

MOVAX,DATA

MOVDS,AX

MOVDX,OFFSETSTRMESSAGE

MOVAH,9H

INT21H

MOVAH,1

INT21H

MOVDL,AL

SUBDL,20H

MOVAH,2

INT21H

EXIT:

MOVAH,4CH

INT21H

CODEENDS

ENDSTART

2.在内存BUFFER单元中定义有10个16位数,试寻找其中的最大值及最小值,并放在指定的存储单元MAX和MIN中。

答:

DATASEGMENT

BUFFERDW10DUP(?

MINDW?

MAXDW?

DATAENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

START:

MOVAX,DATA

MOVDS,AX

MOVBX,OFFSETBUFFER

MOVAX,[BX]

MOVD

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

当前位置:首页 > 成人教育 > 自考

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1