微机原理及应用答案CH03汇编语言程序设计.docx

上传人:b****5 文档编号:11804529 上传时间:2023-04-02 格式:DOCX 页数:27 大小:21.68KB
下载 相关 举报
微机原理及应用答案CH03汇编语言程序设计.docx_第1页
第1页 / 共27页
微机原理及应用答案CH03汇编语言程序设计.docx_第2页
第2页 / 共27页
微机原理及应用答案CH03汇编语言程序设计.docx_第3页
第3页 / 共27页
微机原理及应用答案CH03汇编语言程序设计.docx_第4页
第4页 / 共27页
微机原理及应用答案CH03汇编语言程序设计.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

微机原理及应用答案CH03汇编语言程序设计.docx

《微机原理及应用答案CH03汇编语言程序设计.docx》由会员分享,可在线阅读,更多相关《微机原理及应用答案CH03汇编语言程序设计.docx(27页珍藏版)》请在冰豆网上搜索。

微机原理及应用答案CH03汇编语言程序设计.docx

微机原理及应用答案CH03汇编语言程序设计

CH03汇编语言程序设计

习题与思考题

1.下列语句在存储器中分别为变量分配多少字节空间?

并画出存储空间的分配图。

VAR1DB10,2

VAR2DW5DUP(?

),0

VAR3DB‘HOWAREYOU?

’,3DUP(1,2)

VAR4DD-1,1,0

解答:

字节空间----VAR1:

2;VAR2:

12;VAR3:

20;VAR4:

12。

存储空间的分配图:

DS:

00000A02000000000000—000000000000484F

00105720204152452020—594F553F01020102

00200102FFFFFFFF0100—000000000000

2.假定VAR1和VAR2为字变量,LAB为标号,试指出下列指令的错误之处。

(1)ADDVAR1,VAR2

(2)SUBAL,VAR1

(3)JMPLAB[CX](4)JNZVAR1

(5)MOV[1000H],100(6)SHLAL,4

解答:

(1)两个操作数中至少有一个为寄存器;

(2)AL为字节,VAR1为字变量,不匹配;

(3)[]中不能用CX,LAB为标号,非变量;

(4)转向地址应为标号,不能是变量;

(5)目的操作数的类型不确定;

(6)SHL指令中,当所移位数超过1时,必须用CL或CX来取代所移位数。

3.对于下面的符号定义,指出下列指令的错误。

A1DB?

A2DB10

K1EQU1024

(1)MOVK1,AX

(2)MOVA1,AX

(3)CMPA1,A2(4)K1EQU2048

解答:

(1)K1为常量,不能用MOV指令赋值;

(2)A1为字节,AX为字变量,不匹配;

(3)A1未定义,无法做比较指令;

(4)K1重新赋值前,必须用PURGE释放。

4.数据定义语句如下所示:

FIRSTDB90H,5FH,6EH,69H

SECONDDB5DUP(?

THIRDDB5DUP(?

自FIRST单元开始存放的是一个四字节的十六进制数(低位字节在前),要求:

编一段程序将这个数左移两位后存放到自SECOND开始的单元,右移两位后存放到自

THIRD开始的单元。

(注意保留移出部分)解答:

DATASEGMENT

FIRSTDB90H,5FH,6EH,69H

SECONDDB5DUP(?

THIRDDB5DUP(?

DATAENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

START:

MOVAX,DATA

MOVDS,AX

LEASI,FIRST

LEADI,SECOND

MOVCX,2

CLC

;左移2位

MOVAX,[SI];AX=5F90H为低十六位数据

INCSI

INCSI

MOVDX,[SI];DX=696EH为高十六位数据

PUSHDX;保存原有的高十六位数据

PUSHAX;保存原有的低十六位数据

ROLDX,CL;将高位数据不带进位循环左移两位,即高2位数据在DL的低2位

ANDDL,03H;让DL中仅保存移出的高2位数据

MOV[DI+4],DL;将移出的高2位数据放入SECOND中的最高单元中

ROLAX,CL;将低位数据不带进位循环左移两位,即AX的高2位在AL的低2位

ANDAL,03H;让AL中仅保存移出的AX高2位数据

MOVBL,AL;将AL中的数据放入BL中保存

POPAX;弹出原有的低十六位数据

POPDX;弹出原有的高十六位数据

SHLDX,CL;将高位数据算术逻辑左移2位

SHLAX,CL;将低位数据算术逻辑左移2位

ORDL,BL;将AX中移出的高2位数据放入DX的低2位

MOV[DI],AX

MOV[DI+2],DX

;右移2位

LEASI,FIRST

LEADI,THIRD

MOVCX,2

CLC

MOVAX,[SI];AX=5F90H为低十六位数据

INCSI

INCSI

MOVDX,[SI];DX=696EH为高十六位数据

PUSHDX;保存原有的高十六位数据PUSHAX;保存原有的低十六位数据

RORAX,CL;将低位数据不带进位循环右移两位,即低2位数据在AH的高2位

ANDAH,0C0H;让AH中仅保存移出的低2位数据

PUSHCX

MOVCX,6

SHRAH,CL

POPCX

MOV[DI],AH;将移出的低2位数据放入THIRD中的最低单元中

RORDX,CL;将低位数据不带进位循环左移两位,即AX的高2位在AL的低2位

ANDDH,0C0H;让DH中仅保存移出的DX低2位数据

MOVBL,DH;将DH中的数据放入BL中保存

POPAX;弹出原有的低十六位数据

POPDX;弹出原有的高十六位数据

SHRDX,CL;将高位数据算术逻辑左移2位

SHRAX,CL;将低位数据算术逻辑左移2位

ORAH,BL;将DX中移出的低2位数据放入AX的高2位

MOV[DI+1],AX

MOV[DI+3],DX

MOVAH,4CH

INT21H

CODEENDS

ENDSTART

5.(14)在当前数据区从400H开始的256个单元中存放着一组数据,试编程序将它们顺序

搬移到从A000H开始的顺序256个单元中。

解答:

DATASEGMENT

ORG400H

DAT1DB...;256DUP(?

ORG0A000H

DAT2DB...;256DUP(?

DATAENDS

;

STACKSEGMENT

STACKENDS

;

CODESEGMENT

ASSUMEDS:

DATA,CS:

CODE,SS:

STACK,ES:

DATA

START:

MOVAX,DATA

MOVDS,AX

;CH3-14

LEASI,DAT1LEADI,DAT2

MOVCX,128

AGAIN:

MOVAL,[SI]

MOV[DI],AL

INCSI

INCDI

LOOPAGAIN

;CH3-15,将两个数据块逐个单元进行比较,若有错BL=00H,否则BL=FFH

LEASI,DAT1

LEADI,DAT2

MOVCX,128

NEXT:

MOVAL,[SI]

MOVBL,[DI]

CMPAL,BL

JNZERROR

INCSI

INCDI

LOOPNEXT

MOVBL,0FFH

JMPEXIT

ERROR:

MOVBL,00H

EXIT:

MOVAX,4C00H

INT21H

CODEENDS

ENDSTART

6.试编程序将当前数据区从BUFF开始的4K个单元中均写入55H,并逐个单元读出比较,

看写入的与读出的是否一致。

若全对,则将ERR单元置0H;如果有错,则将ERR单元

置FFH。

解答:

DATASEGMENT

BUFFDB1000HDUP(?

ERRDB?

DATAENDS

;

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

START:

MOVAX,DATA

MOVDS,AX

;将55H依次放入BUFF开始的4K个单元

LEASI,BUFF

MOVCX,1000HMOVAL,55H

NTXT:

MOV[SI],AL

INCSI

LOOPNEXT

;取出与55H比较,全对则ERR=0,否则ERR=FFH

LEADI,BUFF

LEASI,ERR

MOVCX,1000H

NEXT1:

MOVAL,[DI]

INCDI

CMPAL,55H

JNZERROR;若有一个不同,即置ERR=FFH

LOOPNEXT1

MOVAL,00H

MOV[SI],AL;全比较完无错,则置ERR=0

JMPEXIT

ERROR:

MOVAL,0FFH

MOV[SI],AL

;返回DOS

EXIT:

MOVAH,4CH

INT21H

CODEENDS

ENDSTART

END

7.在上题中,如果发现有错时,要求在ERR单元中存放出错的数据个数,则程序该如何修

改?

解答:

DATASEGMENT

BUFFDB1000HDUP(?

ERRDW?

DATAENDS

;

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

START:

MOVAX,DATA

MOVDS,AX

;将55H依次放入BUFF开始的4K个单元

LEASI,BUFF

MOVCX,1000H

MOVAL,55H

NTXT:

MOV[SI],AL

INCSI

LOOPNEXT

;取出与55H比较LEADI,BUFF

LEASI,ERR

MOVDX,0000H

MOVCX,1000H

NEXT1:

MOVAL,[DI]

INCDI

CMPAL,55H

JZNEXT2;若相同,则比较下一个

INCDX;否则将放出错个数的DX加1

NEXT2:

LOOPNEXT1

MOV[SI],DX

;

EXIT:

MOVAH,4CH

INT21H

CODEENDS

ENDSTART

END

8.试编写程序段,完成将数据区从0100H开始的一串字节数据逐个从F0H端口输出,已知

数据串以0AH为结束符。

解答:

DATASEGMENT

ORG0100H

DATA1DBNDUP(?

DATAENDS

;

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

START:

MOVAX,DATA

MOVDS,AX

;将DATA1数据串中的数据取出并从F0H端口中输出

LEASI,DATA1

MOVCX,N

MOVBL,0AH

NTXT:

MOVAL,[SI]

CMPAL,BL

JZEXIT

OUT0F0H,AL

INCSI

LOOPNEXT

;返回DOS

EXIT:

MOVAH,4CH

INT21H

CODEENDSENDSTART

END

9.(24)内存中以FIRST和SECOND开始的单元中分别存放着两个4位用压缩BCD码表示

的十进制数,低位在前。

编程序求这两个数的和,仍用压缩BCD码表示,并存到以THIRD

开始的单元。

解答:

DATASEGMENT

FIRSTDW3412H

SECONDDW7856H

THIRDDB?

?

?

DATAENDS

;

STACKSEGMENT

STACKENDS

;

CODESEGMENT

ASSUMEDS:

DATA,CS:

CODE,SS:

STACK,ES:

DATA

START:

MOVAX,DATA

MOVDS,AX

LEASI,FIRST

LEADI,SECOND

LEABX,THIRD

MOVCX,2

CLC

AGAIN:

MOVAL,BYTEPTR[SI]

MOVDL,BYTEPTR[DI]

ADCAL,DL

DAA

MOVBYTEPTR[BX],AL

INCSI

INCDI

INCBX

LOOPAGAIN

JCAA

MOVBYTEPTR[BX],0

JMPEXIT

AA:

MOVBYTEPTR[BX],1

EXIT:

MOVAX,4C00H

INT21H

CODEENDS

ENDSTART

10.(27)设字变量单元A、B、C存放有三个数,若三个数都不为零,则求三个数的和,存

放在D中;若有一个为零,则将其余两个也清零,试编写程序。

解答:

DATASEGMENT

ADB?

BDB?

CDB?

DDW?

DATAENDS

;

STACKSEGMENT

STACKENDS

;

CODESEGMENT

ASSUMEDS:

DATA,CS:

CODE,SS:

STACK,ES:

DATA

START:

MOVAX,DATA

MOVDS,AX

LEASI,A

LEADI,D

MOVAL,[SI]

CMPAL,00

JZZERO

ADCDX,AL

LEASI,B

MOVAL,[SI]

CMPAL,00

JZZERO

ADCDX,AL

LEASI,C

MOVAL,[SI]

CMPAL,00

JZZERO

ADCDX,AL

MOV[DI],DX

JMPEXIT

ZERO:

MOVAL,0

MOVA,AL

MOVB,AL

MOVC,AL;

EXIT:

MOVAX,4C00H

INT21H

CODEENDS

ENDSTART

11.(16)试编程序,统计由TABLE开始的128个单元中所存放的字符“A”的个数,并将结

果存放在DX中。

解答:

DATASEGMENT

TABLEDBX1,X2,...X128

DATAENDS

;

STACKSEGMENT

STACKENDS

;

CODESEGMENT

ASSUMEDS:

DATA,CS:

CODE,SS:

STACK,ES:

DATA

START:

MOVAX,DATA

MOVDS,AX

LEASI,TABLE

MOVDX,0

MOVCX,128

AGAIN:

MOVAL,[SI]

CMPAL,'A'

JNZNEXT

INCDX

NEXT:

INCSI

LOOPAGAIN

MOVAX,4C00H

INT21H

CODEENDS

ENDSTART

12.试编制一个汇编语言程序,求出首地址为DATA的1000个字数组中的最小偶数,并把

它存放于MIN单元中。

解答:

DATASEGMENT

ARRAYDWX1,X2,...X1000

ARRAY_EVENDW1000DUP(?

)MINDW?

MAXDW?

DATAENDS

;

STACKSEGMENT

STACKENDS

;

CODESEGMENT

ASSUMEDS:

DATA,CS:

CODE,SS:

STACK,ES:

DATA

START:

MOVAX,DATA

MOVDS,AX

;将数组中的偶数放入ARRAY_EVEN中

LEASI,ARRAY

LEADI,ARRAY_EVEN

MOVCX,1000

AGAIN:

MOVAX,[SI]

TESTAX,01h

JNZNEXT

MOV[DI],AX

INCDI

INCDI

NEXT:

INCSI

INCSI

LOOPAGAIN

;找出ARRAY_EVEN中的最大数

LEASI,ARRAY_EVEN

MOVCX,999

MOVAX,[SI]

MOVBX,AX

INCSI

INCSI

NEXT:

CMPAX,[SI]

JAELL

MOVAX,[SI]

LL:

INCSI

INCSI

LOOPNEXT

MOVMAX,AX

;找出ARRAY_EVEN中的最小数(第13题增加的部分)

LEASI,ARRAY_EVEN

MOVCX,999

MOVAX,[SI]

MOVBX,AXINCSI

INCSI

NEXT:

CMPAX,[SI]

JBESS

MOVAX,[SI]

SS:

INCSI

INCSI

LOOPNEXT

MOVMIN,AX

;返回DOS

MOVAX,4C00H

INT21H

CODEENDS

ENDSTART

13.在上题中,如果要求同时找出最大和最小的偶数,并把它们分别存放于MAX和MIN

单元中,试完成程序。

解答:

略(见第12题)。

14.(28)在DATA字数组中存放有100H个16位补码数,试编写一程序求它们的平均值,放

在AX中,并求出数组中有多少个数小于平均值,将结果存于BX中。

解答:

DATASEGMENT

DATDWX1,X2,...X256

DATAENDS

;

STACKSEGMENT

STACKENDS

;

CODESEGMENT

ASSUMEDS:

DATA,CS:

CODE,SS:

STACK,ES:

DATA

START:

MOVAX,DATA

MOVDS,AX

;将数组中的100H个数求和后求平均值

LEASI,DAT

MOVCX,100H

CLC

MOVBX,0000

MOVDX,0000

AGAIN:

MOVAX,[SI]

ADDBX,AX

JNCNEXT

ADCDX,1NEXT:

INCSI

INCSI

LOOPAGAIN

MOVCX,100H

MOVAX,BX

DIVCX

;找出DAT中的小于平均值的个数

LEASI,DAT

MOVCX,100H

MOVDX,0000H

AGAIN0:

MOVBX,[SI]

CMPBX,AX;与平均值AX比较,大于等于则转NEXT0,否则将读数器DX加1

JGENEXT0

INCDX

NEXT0:

INCSI

INCSI

LOOPAGAIN0

MOVBX,DX

;返回DOS

MOVAX,4C00H

INT21H

CODEENDS

ENDSTART

15.(17)编写一个子程序,对AL中的数据进行偶校验,并将经过校验的结果放回AL中。

解答:

DATASEGMENT

COUNTEQU7

DATAENDS

;

STACKSEGMENT

STACKENDS

;

CODESEGMENT

ASSUMEDS:

DATA,CS:

CODE,SS:

STACK,ES:

DATA

START:

MOVAX,DATA

MOVDS,AX

PUSHAX

MOVDX,0

MOVCX,COUNT

AGAIN:

RCRAL,1

JNCLINCDX

L:

LOOPAGAIN

POPAX

TESTDX,01

JZEXIT

ORAL,80

EXIT:

MOVAX,4C00H

INT21H

;ANOTHERMETHORD

JPEXIT

ORAL,80H

EXIT:

MOVAX,4C00H

INT21H

CODEENDS

ENDSTART

16.(18)利用上题的予程序,对DATA开始的256个单元的数据加上偶校验,试编程序。

解答:

DATASEGMENT

DATDB...;256DUP(?

RESULTDB...;256DUP(?

NUMEQU256

COUNTEQU7

DATAENDS

;

STACKSEGMENT

STACKENDS

;

CODESEGMENT

ASSUMEDS:

DATA,CS:

CODE,SS:

STACK,ES:

DATA

START:

MOVAX,DATA

MOVDS,AX

LEASI,DAT

LEADI,RESULT

MOVCX,NUM

NEXT:

MOVAL,[SI]

CALLSUB1

MOV[DI],AL;MOV[SI],ALINCSI

INCDI

LOOPNEXT

MOVAX,4C00H

INT21H

SUB1PROC

PUSHAX

MOVDX,0

MOVCX,COUNT

AGAIN:

RCRAL,1

JNCL

INCDX

L:

LOOPAGAIN

POPAX

TESTDX,01

JZQUIT

ORAL,80H

QUIT:

RET

SUB1ENDP

CODEENDS

ENDSTART

17.(19)试编写程序实现将键盘输入的小写字母转换成大写字母并输出。

解答:

DATASEGMENT

MESSDB'THEINPUTISNOTCORRECT.',0DH,0AH,'$'

DATAENDS

;

STACKSEGMENT

STACKENDS

;

CODESEGMENT

ASSUMEDS:

DATA,CS:

CODE,SS:

STACK,ES:

DATA

START:

MOVAX,DATA

MOVDS,AX

NEXT:

MOVAH,01H

INT21H

CMPAL,'Q'

JZEXIT

CMPAL,'a'JBERROR

CMPAL,'z'

JAERROR

SUBAL,20H

MOVAH,02H

MOVDL,AL

INT21H

JMPNEXT

ERROR:

MOVAH,09H

LEADX,MESS

INT21H

JMPNEXT

EXIT:

MOVAX,4C00H

INT21H

CODEENDS

ENDSTART

18.从键盘接收20个字符,按键入顺序查找最大的字符,并显示输出。

解答:

DATASEGMENT

DATDB20DUP(?

DATAENDS

;

STACKSEGMENT

STACKENDS

;

CODESEGMENT

ASSUMEDS:

DATA,CS:

CODE,SS:

STACK,ES:

DATA

STA

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

当前位置:首页 > 解决方案

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

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