微机原理第二课后作业第五八章朱金钧.docx
《微机原理第二课后作业第五八章朱金钧.docx》由会员分享,可在线阅读,更多相关《微机原理第二课后作业第五八章朱金钧.docx(92页珍藏版)》请在冰豆网上搜索。
微机原理第二课后作业第五八章朱金钧
第5章汇编语言程序设计
教材习题解答
1.下列语句在存储器中分别为变量分配多少字节?
VR1
DW
9
VR2
DW
4DUP(?
>
CONTEQU
10
VR3
DD
CONTDUP(?
>
VR4
DB
2DUP(?
,CONTDUP(0>>
VR5
DB
‘HOWAREYO?
U'
【解】VR1:
2B;
VR2:
8B
;CONT:
1B;VR3:
40B;
12Bkg3K2HUCPIb5E2RGbCAP
VR4:
2.根据下列数据定义,写出各条指令执行后的结果
VR5:
【解】(1>AX=1(2>BX=2
DI=4aFxXOOD8Gfp1EanqFDPw
TABLEDW100DUP(?
>
ARRAYDB‘ABCD'
RESDB?
(1>
MOVAX,TYPERES
AX=<
)
(2>
MOVBX,TYPETABLE
BX=<
)
(3>
MOVCX,LENGTHTABLE
CX=<
)
(4>
MOVSI,SIZETABLE
SI=<
)
(5>
MOVDI,LENGTHARRAYDI=<
)
(3>CX=100(4>SI=200(5>
3.下面定义的是一个数据段,请图示它们在存储器中的存放形式。
DATASEGMENT
A
DB
1,2,3,4
B
DB
‘ABCD'
C
DB
4DUP(0>
N
EQU
12
X
DW
33,0302H
Y
DD
0ABCDH
DATAENDS
4.
【解】注:
括号中为段内偏移地址
(0000H>
A
1
(0008H>C
0
(0011H>
Y
03H
2
0
0CDH
3
0
0ABH
4
0
00H
(0004H>
B
A
(000CH>N
12
00H
B
(000DH>X
17H
C
00H
D
02H
试定义一个完整的数据段,首先将
10个压缩的BCD码29存放在ARRA^量字节
单元,紧接着把-28,6,45,39,3存放在ALPHA数组变量的字单元中,最后从字节变
量BUFFER^元开始预留100个空单元备用。
aFxXOOD8GfDXDiTa9E3d
【解】
DATASEGMENT
ARRAYDB10DUP(29H>
ALPHADW-28,6,45,39,3
BUFFERDB100DUP(?
>
DATAENDS
5.请定义一个结构,描述一个学生的简况。
该结构应含有以下内容:
姓名、年龄、性别、籍贯、民族、入学成绩、名次。
说明如何定义结构变量和引用结构变量。
aFxXOOD8GfRTCrpUDGiT
【解】
STUDENSTRUC
NAMEDW5DUP(?
>
AGEDB(?
>
SEXDW(?
>
HOMEPLAW10DUP(?
>
RACEDW5DUP(?
>
GRADEDB(?
>
SORTDB(?
>
STUDENTENDS
定义结构变量的格式:
结构变量名结构名〈字段值表〉
例如:
STU1STUDENT〈1,‘ZHANG'〉引用结构变量的格式:
结构变量名.结构字段名,例如:
STU1.NAME
6.实现满足下面要求的宏定义。
(1>任意两个单元中的数据相加存于第三个单元中。
(2>任意8位寄存器中的数据转换为ASCII码并在屏幕上显示。
【解】(1>宏定义的代码段如下:
ADDMMACROM1,M2,M3
MOVAX,[M1]
ADDAX,[M2]
MOV[M3],AX
ENDM
(2>设8位寄存器存储的是无符号数,最高位是百位。
宏定义的代码段如下:
ADDMMACROY
;形式参数Y代表一个8位寄存器
MOV
AL
,Y
XOR
AH
,AH
MOV
DL
,100
DIV
DL
ADD
AL
,30H
MOV
DL
,AL
MOV
AL
,AH
;存余数
MOV
AH
,2
INT
21H
;显示百位数
XOR
AH
,AH
MOV
DL
,10
DIV
DL
ADD
AL
,30H
MOV
DL
,AL
MOV
AL
,AH
;存余数
MOV
AH
,2
INT
21H
;显示十位数
ADD
AL,
30H
MOVDL,AL
MOVAH,2
;显示个位数
INT21H
ENDM
7.对下面程序进行注释,并说明其功能
DATA
SEGMENT
A
DB‘123ABC'
DATA
ENDS
CODE
SEGMENT
ASSUMECS:
CODE,DS:
DATA
XCHGAL,DL
INCBX
INT21H
LOOPLP
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
解】注释如下:
DATASEGMENT;数据段开始
ADB‘123ABC'
DATAENDS;数据段结束
CODESEGMENT;代码段开始
ASSUMECS:
CODE,DS:
DATA
START:
MOV
AX,DATA
MOV
DS,AX
;装填数据段
LEA
BX,A
;传送变量的地址
MOV
CX,6
MOV
AH,2
LP:
MOV
AL,[BX]
XCHG
AL,DL
INCBX
INT21H
B”、“C'送屏幕显示
LOOPLP
;CX=6,循环6次
MOV
AH,4CH
INT
21H
;返回DOS
CODEENDS
;代码段结束
END
START
;源程序结束
程序的功能:
显示从
A开始的
6个字节单元中的字符。
;将字符1、2、3、“A
;系统功能调用,功能号:
2,
8.编程将CXDX作为双字联合右移四位<设CX为高16位),最高4位送入全1。
解】程序代码如下:
CODESEGMENT
ASSUMECS:
CODE
START:
MOVAX,CX
MOVCX,4
LP:
SHRAX,1
RCRDX,1LOOPLP
ORAX,0F000H
MOVCX,AX
MOVAH,4CHINT21H
CODEENDS
ENDSTART
;代码段开始
;返回DOS
;代码段结束
;源程序结束
9.编程把从A单元开始存放的3个单字节无符号数按递增顺序排序后存回原处
解】程序代码如下:
DATASEGMENT
;数据段开始
ADB3DUP(?
>
DATAENDS;数据段结束
CODESEGMENT;代码段开始
ASSUMECS:
CODE,DS:
DATA
START:
MOV
AX,DATA
MOV
DS,
AX
;装填数据段
LEA
BX,
A
;传送变量的地址
MOV
AL,
[BX]
CMPAL,[BX+1]
JAEEX1
CMP2:
CMPAL,
[BX+2]
JAEEX2
;[BX]>[BX+2],交换
JMP
CONT1
EX1:
XCHGAL,
[BX+1]
XCHG
AL,[BX]
MOV
AL,[BX]
JMP
CMP2
EX2:
XCHGAL,
[BX+2]
XCHG
AL,[BX]
MOV
AL,[BX]
CONT1:
MOV
AL,[BX+1]
CMP
AL,[BX+2]
JB
CONT2
XCHG
AL,[BX+2]
;[BX+1]>[BX+2],交换
XCHG
AL,[BX+1]
CONT2:
MOV
AH,4CH
INT
21H
;返回DOS
CODE
ENDS
;代码段结束
END
START
;源程序结束
;[BX]>[BX+1],交换
10.试编写一段程序比较从ARRAYS始存放的3个16位有符号数。
根据比较结果置
FLAG标志。
(1>如果3个数都不相等,置FLAG为0。
(2>如果3个数中有2个数相等,置FLAG为1。
(3>如果3个数都相等,置FLAG为2。
【解】程序代码如下:
DATASEGMENT;数据段开始
ARRAYDW3DUP(?
>
FLAGDB?
DATAENDS;数据段结束
CODESEGMENT;代码段开始
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX;装填数据段
LEA
BX,ARRAY
;传送变量的地址
MOV
AX,[BX]
CMP
AX,[BX+2]
JE
EQU1
;[BX]
=[BX+2]
MOV
DL,0
JMP
CONT1
EQU1:
MOVDL
,1
CONT1:
CMPAX
,[BX+4]
JE
EQU2
;[BX]
=[BX+4]
JMP
CONT2
EQU2:
ADDDL
,1
CONT2:
MOV
AX,[BX+2]
CMP
AX,[BX+4]
JE
EQU3
JMP
CONT3
EQU3:
ADDDL
,1
CONT3:
CMP
DL,3
JNZ
EQU4
;[BX]
=[BX+2]
SUB
DL,1
EQU4:
MOVFLAG,DL
MOV
AH,4CH
INT
21H
;返回
DOS
CODE
ENDS
;代码段结束
END
START
;源程序结束
,执行MOVDL,1
,DL+1
=[BX+4],DL—1
ASSUMECS:
CODE,DS:
DATA
LOOPLP
MOVSUM,AX
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
请问:
(1>该程序完成的功能是。
(2>程序执行后,SUM单元的内容是。
【解】
(1>该程序完成的功能是计算0〜20的偶数和。
(2>程序执行后,SUM单元的内容是110。
12.从ARRAYS始的单元中存有10个16位无符号数,试编一完整程序找出其中最小
数并存入MIN单元。
aFxXOOD8Gf5PCzVD7HxA
【解】程序代码如下:
DATA
SEGMENT
;数据段开始
ARRAY
DW0F454H,
4540H,0D214H,8354H,8210H,
0A673H,5656H,0021H,0567H,4228H
MIN
DW?
DATA
ENDS
;数据段结束
CODE
SEGMENT
;代码段开始
ASSUMECS:
CODE,DS:
DATA
START:
MOV
AX,DATA
MOV
DS,AX
;装填数据段
LEA
BX,ARRAY
;传送变量的地址
MOV
AX,[BX]
MOV
CX,9
LP1:
INC
BX
INC
BX
CMP
AX,[BX]
JBCONT1
;AX<[BX],转移
MOV
AX,[BX]
;AX>=[BX],AX
CONT1:
LOOPLP1
MOVMIN,AX
MOVAH,4CH
;返回DOS
;代码段结束
;源程序结束
INT21H
CODEENDS
ENDSTART
13.从DAT开始的数据区中放有100个8位的无符号数,编程统计其中奇数的个数,
将结果存入RESULT单元。
aFxX00D8GfjLBHrnAILg
解】程序代码如下:
DATASEGMENT;数据段开始
DATDB26,45,44,32,90,2,1,81,2,120,5……
RESULTDB?
DATAENDS;数据段结束
C0DESEGMENT;代码段开始
ASSUMECS:
C0DE,DS:
DATA
START:
MOV
AX,DATA
MOV
DS,AX
;装填数据段
LEA
BX,DAT
;传送变量的地址
XOR
AX,AX
XOR
DX,DX
MOV
DL,2
MOV
CX,100
LP1:
MOV
AL,[BX]
DIV
DL
;余数在AH中
CMPAH,0
JEC0NT1
INCDH
;DH用作计数器
CONT1:
INC
BX
LOOP
LP1
MOV
RESULT,DH
MOV
AH,4CH
INT
21H
;返回DOS
CODE
ENDS
;代码段结束
END
START
;源程序结束
14.利用DOS系统功能调用,将键盘输入的小写字母转换成大写字母输出显示,直到输入“$”字符时停止输出。
aFxX00D8GfxHAQX74J0X
【解】调用1号系统功能,键入的字符送AL寄存器,并送屏幕显示输出。
调用2号系
统功能,将DL寄存器中的内容送屏幕显示输出。
程序代码如下:
aFxXOOD8GfLDAYtRyKfE
;代码段开始
CODESEGMENT
ASSUMECS:
CODE
START:
XORAX,AX
INPU:
MOVAH,1
INT
21H
;键盘输入单字符送AL
MOV
BL,
‘$'
CMP
AL,
BL
JE
EXT
SUB
AL,
20H
;转换成大写字母
MOV
DL,
AL
MOV
AH,
2
INT
21H
;将DL中的字符送屏幕显示
JMP
INPU
EXT:
MOV
AH,
4CH
INT
21H
;返回DOS
CODE
ENDS
;代码段结束
;源程序结束
ENDSTART
15.建立两个过程:
一个过程将16进制数变换成ASCII码,一个过程将ASCII码字
符在屏幕上显示输出。
aFxXOOD8GfZzz6ZB2Ltk
解】程序代码如下:
DATA
SEGMENT
;数据段开始
LIST
DB
?
;存储一个十六进制数(1位>
ASC
DB
?
;存储转换的ASCII码
DATA
ENDS
;数据段结束
CODE
SEGMENT
;代码段开始
ASSUMECS:
CODE,DS:
DATA,ES:
DATA
START:
MOV
AX,DATA
MOV
DS,AX
;装填数据段
CALL
CHANGE
CALL
OUTPTR
MOV
AH,4CH
INT
21H
;返回DOS
CHANGEPROC
MOV
AL,LIST
CMP
AL,
9
JA
NEXT1
;AL>9,转移
OR
AL,
30H
JMPNEXT2
NEXT1:
ADDAL,37H
NEXT2:
MOVASC,AL
RET
CHANGEENDP
OUTPTRPROC
MOVDL,ASC
MOVAH,2
INT21H
RET
OUTPTRENDP
CODEENDS;代码段结束
ENDSTART;源程序结束
16.要求编写程序比较两个最大长度为100个字符的字符串ALFA1和ALFA2是否相等,若相等则输出显示“AllRight!
”,否则输出显示“Error!
”。
aFxXOOD8GfdvzfvkwMI1
【解】完成输出显示功能时,调用9号系统功能,功能是将指定的内存缓冲区中的字符串在屏幕上显示出来,缓冲区的字符串以“$”为结束标志。
aFxXOOD8Gfrqyn14ZNXI
LEN指定的内存中存储两字符串中长串的长度,否则,即使两串相等,由于字符
串后面的随机字符,将影响判断结果。
aFxXOOD8GfEmxvxOtOco
程序代码如下:
DATA
SEGMENT
;数据段开始
ALFA1
DB
100DUP(?
>
ALFA2
DB
100DUP(?
>
RESULT1DB‘AllRight!
$'
RESULT2DB‘Error!
$'
LEN
DB100
;字符串长度
DATA
ENDS
;数据段结束
CODE
SEGMENT
;代码段开始
ASSUMECS:
CODE,
DS:
DATA,ES:
DATA
START:
MOV
AX,DATA
MOV
DS,AX
;装填数据段
MOV
ES,AX
;装填附加段
LEA
BX,ALFA1
;传送源串的地址
MOV
SI,BX
LEA
BX,ALFA2
;传送目的串的地址
MOV
DI,BX
XOR
CX,CX
MOV
CL,LEN
REPNZCMPSB
JZ
EQQ
;若ZF=1,说明两串相等,转EQQ
LEA
DX,RESULT2
;输出显示“Error!
”
JMP
OUT1
EQQ:
LEADX
,RESULT1
;输出显示“AllRight!
”
OUT1:
MOVAH,9
INT
21H
STOP:
MOV
AH,4CH
INT
21H
;返回DOS
CODE
ENDS
;代码段结束
END
START
;源程序结束
CLD
;清方向标志,使正向传送
17.有一个最大长度为80个字符的字符串STRING试编写程序找出第一个空格的位置<用00H-4FH表示),并存入CL中。
若该串无空格,则将OFFH存入CL中。
aFxXOOD8GfSixE2yXPq5
【解】程序代码如下:
DATA
SEGMENT
;数据段开始
STRING
DB
80DUP(?
>
LENDB80
DATA
ENDS
;数据段结束
CODE
SEGMENT
;代码段开始
ASSUMECS:
CODE,DS:
DATA,ES:
DATA
START:
MOV
AX,DATA
MOV
DS,AX
;装填数据段
MOV
ES,AX
;装填附加段
MOV
AL,‘'
;要查找的关键字<空格)
LEA
BX,STRING
;传送串的地址
MOV
DI,BX
XOR
CX,CX
MOV
CL,LEN
CLD
;清方向标志,使正向传送
REPNZSCASB
;搜索关键字
JZFOUND
;若ZF=1,说明找到,转FOUND
MOV
CL,0FFH
JMP
STOP
FOUND:
MOVAL
,LEN
SUBAL,CLMOVCL,AL
;CL中是剩余的字符数
STOP:
MOV
AH,4CH
INT
21H
;返回DOS
CODE
ENDS
;代码段结束
END
START
;源程序结束
18.在AX中存放着压缩BCD码的十进制数。
要求:
(1>将AH中的数转换成二进制数。
(2>求AH与AL中数的和,将结果转换成ASCII码,然后在屏幕上显示出来。
CODESEGMENT
ASSUMECS:
CODE
START:
MOVBX,AX
ANDAH,0FH
MOVAL,AH
MUL100
MOVDX,AX
MOVAH,BH
MOVCL,4
SHRAH,CL
MOVAL,AH
MUL1000
ADDAX,DX
;百位加千位结果存于DX中
;返回DOS
;代码段结束
;源程序结束
ASCII码,然后在屏幕上显示出来。
程
;代码段开始
;保存AX中的数据
;移位次数
MOVDX,AX
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
(2>求AH与AL中数的和,将结果转换成
序代码如下:
CODESEGMENT
ASSUMECS:
CODE
START:
MOVBX,AX
MOVCL,4
SHRAH,CL
;千位移到AH低4位
ADDAH,30H
;转换成ASCII码
MOVDL,AH
MOVAH,2
INT21H
;调用2号系统功能,输出单字符
MOVAH,BH
ANDAH,0FH
;取低4位
ADDAH,30H
;转换成ASCII码
MOVDL,AH
MOVAH,2
INT21H
;调用2号系统功能,输出单字符
MOVAL,BL
MOVCL,4
;移位次数
SHRAL,CL
;十位移到低4位