当前位置:文档之家› 汇编语言习题以及答案

汇编语言习题以及答案

习题
4-4.试编程序将内存从50000H到5FFFFH的每个单元均写入数55H,并再逐个单元读出比较,看写入的与读出的是否一致。

若全对,则将AL置0;只要有错,则将AL置0FFH。

解:
START:MOV AX,5000H
MOV DS,AX
MOV SI,0
MOV CX, 0FFFFH
LOOP1: MOV BYTE PTR [SI], 55H
MOV AL, [SI]
CMP AL, 55H

JNZ LOOPERR
LOOP2: INC SI
LOOP LOOP1
MOV BYTE PTR [SI], 55H ;最后一个单元
MOV AL, [SI]
CMP AL, 55H
JNZ LOOPERR
MOV AL, 0 ;全对
JMP LOOPOUT
LOOPERR: MOV AL, 0FFH
>
LOOPOUT: NOP
4-5.编写一个子程序,对AL中的ASCII字符添加偶校验位(bit7),即:使AL中的“1”的个数为偶数。

解:
ADDPARITY PROC NEAR
AND AL, 7FH
JP ADDEXIT
OR AL, 80H
ADDEXIT: RET
&
ADDPARITY ENDP
4-6.利用上题的子程序,编程对内存物理地址10000H开始的1024个单元的ASCII字符加上偶校验位。

解:
START:MOV AX,1000H
MOV DS,AX
MOV SI,0
MOV CX, 1024
LOOP1: MOV AL, [SI]
CALL ADDPARITY
[
MOV [SI], AL
INC SI
LOOP LOOP1
4-7、试写一子程序,完成对一个8位无符号数乘6的操作。

要求:(1)只能用传送、加法及移位指令;(2)入口参数(即8位无符号数)放于AL中,出口参数(即乘6后的结果)放于AX。

解:
MULTI6 PROC NEAR
PUSH BX
MOV AH, 0
]
SHL AX, 1 ;乘2
MOV BX, AX
SHL AX, 1 ;乘4
ADD AX, BX ;乘6
POP BX
RET
MULTI6 ENDP
4-8.给定如下程序片段:
\
START: MOV AX, 1000H,
MOV SS, AX
MOV SP, 000FH
MOV AX, 1000H
PUSH AX
MOV BX, 5439H
PUSH BX
CALL NEAR PTR SUBRT
POP AX
STOP0: HLT
]
SUBRT: PUSH BP
MOV BP, SP
VAAX:MOV AX, [BP+4]
ADD AX, 456AH
MOV [BP+4], AX
POP BP
RET 4
问:(1)程序执行到标号为SUBRT处的指令时,SP = (2)执行完标号为VAAX的MOV指令后,AX = (3)执行到标号为STOP0处的指令时:SP = AX = BX = CF= SF= OF=
解:
(1)程序执行完标号为SUBRT处的“PUSH BP”指令后,SP=0007H
(2)[
(3)执行完标号为VAAX的MOV指令后,AX =5439H
(4)程序执行到标号为STOP0处的指令时(实际执行“HLT”指令之前):SP = 0011H
AX = 99A3H
BX = 5439H
以及以下标志寄存器的内容:
CF = 0
SF = 1
OF = 1
[
4-9.自符号地址为MARK开始的内存缓冲区中,存有100个学生的某门课的考试成绩。

试找出成绩不低于80分以及成绩低于60分的学生个数,同时求出最高的成绩分及最低的成绩分数,并将它们分别存于符号地址为PST、FST、MAXMK及MINMK的四个单元中。

要求写出完整的数据段及代码段。

解:
DATA SEGMENT
MARK DB 100 DUP()
PST DW 0
FST DW 0
MAXMK DB 0
MINMK DB 100
/
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START: MOV AX, DATA
MOV DS, AX
MOV CX, 100
MOV BX, OFFSET MARK
AGAIN: MOV AL, [BX]
CMP AL, MAXMK
`
JC HIGHL
MOV MAXMK, AL ; update highest mark
HIGHL: CMP AL, MINMK
JNC MKCHK
MOV MINMK, AL ; update lowest mark
MKCHK: CMP AL, 60
JNC HIGHMK
INC FST ; increase the no. of students whose mark < 60
JMP CHKFH
HIGHMK: CMP AL, 80
]
JC CHKFH
INC PST ; increase the no. of students whose mark >= 80
CHKFH: INC BX
LOOP AGAIN
MOV AX, 4C00H
INT 21H
CODE ENDS
END START
]
4-10.编写一段程序,接收从键盘输入的10个数(输入回车符后结束),然后将这些数按位取反后存于BUFF开始的缓冲区中。

解:
DATA SEGMENT ;数据段
BUFF DB 10 DUP (0) ;数据区
DATA ENDS
STACK SEGMENT STACK ‘STACK’;堆栈段
DB 100 DUP()
STACK ENDS
CODE SEGMENT ;代码段
#
ASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX,DATA
MOV DS,AX
MOV CX, 10
LEA SI, BUFF
REPT1: MOV AH, 1 ;键入数据
INT 21H
CMP AL, 0DH ;判断是否是回车键
JE NEXT1 ;若键入回车,则结束
NOT AL
!
MOV [SI], AL
INC SI
LOOP REPT1 ;若已输满10个数则结束NEXT1: MOV AX,4C00H
INT 21H
CODE ENDS
END START
4-12.试定义一条能对任意寄存器进行左移指定位的宏指令。

解:
[
SHIFT MACRO REG, COUNT
LOCAL LEND
PUSH CX
MOV CL, COUNT
CMP CL, 1
JC LEND ; for COUNT < 1, do not shift
SHL REG, CL
LEND: POP CX
ENDM
4-13.某人写了如下宏定义,以将某寄存器中的一位16进制数转化为相应的ASCII码。

试分析该宏定义是否有错,若有,试指出错误之处及原因。

HEXASC MACRO HEXREG
PUSHF
CMP HEXREG,10
JL LS10
ADD HEXREG,'a'-‘0’- 10
LS10:ADD HEXREG,‘0’
POPF
RET
HEXASC ENDP
解:
错误之处:
(1)开始处缺:LOCAL LS10
(2)应去除“RET”语句
(3)“HEXASC ENDP”应为“ENDM”(
(4)。

相关主题