微型计算机原理应用第四版答案 下载本文

答:对有符号数,执行CMP指令后影响ZF和OF标志位,不影响CF位。 执行后标志位分别为ZF=0;OF=0 第6章习题

.读下面程序段,请问:在什么情况下,本段程序的执行结果是AH=0? BEGIN: IN AL,5FH

TEST AL,80H JZ BRCHl MOV AH,0 JMP STOP BRCHl: MOV AH,0FFH STOP: HLT

解答:AL中的最高位为1时。 .读程序:

START: IN AL,20H MOV BL,AL IN AL,30H MOV CL,AL MOV AX,0 ADLOP: ADD AL,BL ADC AH,0 DEC CL JNZ ADLOP HLT 请问: (1)本程序实现什么功能? (2)结果在哪里?

解答:完成20H*30H,结果在AX中。

请编一程序段完成AX*10的任务(要求不准用乘法指令做) 答:MOV BX,AX MOV CL 2

SHL AX, CL ;此句实现了AX=AX*4 ADD AX,BX ;此句使得AX=5AX

SHL AX ,1 ;此句实现了5AX*2=10AX 法二:MOV BX,AX MOV CL, 4 SHL AX,CL SHL BX,1 ADD AX,BX .编程序使:

(1)AX寄存器低4位清零。 (2)BX寄存器低4位置“1”。 (3)CX寄存器低4位变反。

(4)用TEST指令测试DL寄存器位3、位6是否同时为0,若是,将0送DL;否则l送DH。

解答 :(1) AND AX ,0FFF0H (2) OR BX ,000FH (3) XOR CX ,000FH 或者NOT CX(但这样CX的高4位也会变反) (4)TEST DL ,48H

JZ LOOP MOV DH,1 HLT LOOP :MOV DL ,0 HLT

.编一程序段,完成符号函数(-128≤x≤127):

1 (x>0)

y= 0 (x=0) -1 (x<0)

假设x的值存放在DATAl中,y的值存放在DATA2中。 解答: START :MOV AL ,DATA1 AND AL,AL JGE BIGR MOV AL,81H ;即将-1给AL MOV DATA2,AL HLT

BIGR: JE EQUL ;结果为0,转EQUL MOV AL,1 MOV DATA2,AL HLT

EQUL: MOV AL,O

MOV DATA2,AL

HLT

.设AX寄存器中有一个16位二进制数,编一程序,统计AX中“l”的个数,统计结果送CX中。

解答: START : MOV CX ,0 ;CX清零也可用XOR CX,CX实现 LOOP1: CLC ;CF清零

SUB AX,0 ;此句也可用CMP AX,O替代

JZ STP

SAL AX,1 ;此句也可用SHL AX,1替代 JNC NOD INC CX NOD: JMP LOOP1 STP: HLT

6.7.编一子程序利用XLAT指令把十六进制数转换成ASCII码。假设ASCII码存放在以 DAT1为首地址的数据区中,对应的16进制数放在以DAT2为首地址的数据区中,转换结果送以DAT3为首地址的数据区中。 解答: SUBPROC PROC

SUBPROC :PUSH BX PUSH SI

PUSH DI PUSH CX PUSH AL PUSH DS

START: MOV BX,DATA1 ;将首地址DAT1送到BX中,作为表的首地址 MOV SI ,DAT2 MOV DI DAT3

MOV CX ,16 NEST: LODSB ;读字节串,从地址为SI的RAM读16进制数到AX/AL

XLAT ;用换码指令XLAT将AX/AL中的16进制数转换成

;对应的ASCII码

STOSB ;写字节串,从AX/AL写到RAM,即将转换成的ASCII码送

;到目标地址DI处

LOOP NEST ;CX!=0,就转向NEST,SI与DI都会自动增1 POP DS POP AL POP CX POP DI POP SI POP BX RET SUBPROC ENDP

本题重点:(1)所有的串操作指令,如LODSB, STOSB等都用寄存器SI对源操作数进行间接寻址;都用寄存器DI为目的操作数进行间接寻址。 (2)在每次循环后,地址指针SI和DI都会受到修改;

(3)XLAT指令的用法,见教材P118,用BX给定首地址,用AL/AX给定偏移地址,再用XLAT指令转换。 第7章习题

假设学生某门课程的成绩放在数据区中,请编一程序,统计该成绩中小于60分的人数,60~90分的人数,大于90分的人数,并显示在屏幕上。 答:分析:假设学生成绩放在以DATA1为首地址的数据区中。 DATASEG SEGMENT DATA1 DB 100 DUP (?) STRING1 DB ’The student number of grade is bigger than 90’ STRING2 DB ‘The student number of grade is between 60 and 90’ STRING3 DB ’The student number of grade is less than 90’

DATASEG ENDS SS1 SEGEMENT STACK DW 30 DUP(?) SS1 ENDS CODE SEGMENT ASSUME CS: CODE, DS:DATASEG, SS:SS1 START: MOV AX, DATASEG MOV DS, AX

MOV SI, OFFSET DATA1

MOV CL, 100(D); 将学生人数100赋给CL

XOR BX, BX XOR AX, AX XOR DX, DX A1: MOV AX, [SI] CMP AX, 90(D) JA L1 CMP AX, 60(D) JAE L2 INC CH ;用CH保存小于60的人数 JUMP A2 L1: INC BH ;用BH保存大于90的人数 JUMP A2

L1: INC BL ;用BL保存60到90的人数 JUMP A2 A2: INC SI LOOP A1

;----------------在屏幕上输出各类人数

MOV DX, OFFSET STRING1 MOV AH, 9 INT 21H

MOV DL, CH

MOV AH, 2 INT 21H ; ---------输出60-90的学生人数 MOV DX, OFFSET STRING2 MOV AH, 9 MOV DL, BL MOV AH, 2 INT 21H ;----------------输出小于60的学生人数

MOV DX, OFFSET STRING3 MOV AH, 9 MOV DL, BH MOV AH, 2 INT 21H ;----------程序完成,返回操作系统,结束 MOV AH, 4CH INT 21H

CODE ENDS