汇编语言习题以及答案

  • 格式:doc
  • 大小:48.00 KB
  • 文档页数:6

习题

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) 执行完标号为VAAX的MOV指令后,AX =5439H

(3) 程序执行到标号为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”