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