1、微机原理习题3习 题 33.1 在以Block为首地址的字节单元中,存放了一个班级的学生考试成绩。试编写一程序,利用学生的序号来查表得到该学生的成绩,设学生的序号在NUMBER单元,查表结果存入RESULT单元。解:DSEG SEGMENT BLOCK DB 67,78,86,57,88,75,78,96,77,88,87,95,67,86,83,55 NUMBER DB 9 ; 要显示的16进制数字 RESULT DB ? ; 存放要显示数字对应的七段码DSEG ENDSCSEG SEGMENT ASSUME CS: CSEG, DS:DSEGSTART :MOV AX, DSEG MOV
2、DS, AX MOV BX, OFFSET BLOCK MOV AL, NUMBER ; 取16进制数字 AND AL, 0FH XLAT ; 查表取得对应的七段码 MOV RESULT, AL ; 保存 MOV AX, 4C00H INT 21HCSEG ENDS END START3.2 试编程序,统计由52600H开始的100个单元中所存放的字符“A“的个数,并将结果存放在DX中。解:CSEG SEGMENT ASSUME CS: CSEGSTART :MOV AX, 5260H MOV DS, AX MOV BX, 0 MOV AL, A MOV CX,100 MOV DX,0AGA:
3、CMP AL,BX JNZ LP INC DXLP: INC BX LOOP AGA MOV AX, 4C00H INT 21HCSEG ENDS END START3.3 在当前数据段(DS),偏移地址为GRADE开始的连续80个单元中,存放着某班80个同学某门考试成绩。按要求编写程序:试编写程序统计90分;80分89分;70分79分;60分69分,60分的人数各为多少,并将结果放在同一数据段、偏移地址为LEVEL开始的连续单元中。试编写程序,求该班这门课的平均成绩为多少,并放在该数据段的AVER单元中。解:DATA SEGMENT GRADE DB 80 DUP(?) ;运行前置入具体数据
4、 LEVEL DB 0 ;大于90 LEVEL1 DB 0 ;80分89分 LEVEL2 DB 0 ;70分79分 LEVEL3 DB 0 ;60分69分 LEVEL4 DB 0 ;60分 AVER DB ?DATA ENDS CODE SEGMENT ASSUME CS: CODE, DS: DATA START: MOV AX, DATA MOV DS, AX LEA SI, GRADE MOV DX,0 MOV CX, 80 AGAIN: MOV AL, SI CMP AL, 59 ;分段测试 JA L1 L0: INC LEVEL4 JMP NEXT L1: CMP AL, 69 JA
5、 L2 INC LEVEL3 JMP NEXT L2: CMP AL, 79 JA L3 INC LEVEL2 JMP NEXT L3: CMP AL, 89 JA L4 INC LEVEL1 JMP NEXT L4: INC LEVEL NEXT: ADD SI, 1 ADD DL,AL ;求累加和 ADC DH,0 LOOP AGAIN MOV AX,DX MOV BL,80 DIV BL MOV AVER,ALEXIT: MOV AX, 4C00H INT 21H CODE ENDS END START3.4 在以字节变量ARRAY为首地址的内存区域存储了一组带符号的数据,试编写程序将数
6、据组的所有正数相加,并将和送入SUM字单元。解:DATA SEGMENTARRAY DB 12,-67,44,67,-35,66,55,-98,87,-87,33,83COUNT EQU $-ARRAYSUM DW ? ;SUM存放累加和DATA ENDSCODE SEGMENT ASSUME DS: DATA, CS: CODESTART: MOV AX, DATA MOV DS, AX MOV BX, 0 ;BX是数组元素在数组内的位移,初值0 MOV CX, COUNT ;装载循环计数器的初始值 MOV DX, 0 ;累加器AX清零ONE: MOV AL,ARRAYBX CMP AL,0
7、 JLE NEXT CBW ADD DX,AX ;NEXT: INC BX ;修改BX的值,为下一次操作做准备 LOOP ONE ;计数循环 MOV SUM, DX ;保存结果(累加和) MOV AX, 4C00H INT 21HCODE ENDS END START3.5 若某班有50名学生,考汇编语言课程,且所有考生的成绩都已存放自XX单元开始的内存区中,试编写一程序找出最高分和最低分。解:DATA SEGMENT XX DB 50 DUP (?) ;运行前置入具体数据 COUNT EQU $-XX MIN DB ? MAX DB ?DATA ENDSCODE SEGMENT ASSUME
8、 CS: CODE, DS: DATA START: MOV AX, DATA MOV DS, AX MOV MIN, 100 ;假设最小的数 MOV MAX, 0 ;假设最大的数 LEA SI, XX MOV CX, COUNTAGAIN: MOV AL, SI CMP AL, MIN JAE SKIP1 MOV MIN, AL ;比预设最小值还小,保留SKIP1: CMP AL, MAX JBE SKIP2 MOV MAX, AL ;比预设最大值还大,保留SKIP2: INC SI LOOP AGAINEXIT: MOV AX, 4C00H INT 21H CODE ENDS END ST
9、ART3.6 在首地址为ARRAY为首地址的内存区域里,存放了一组带符号的数据,试编写程序分别统计零、正数和负数的个数,统计结果分别存放在ZZ、XX、YY中。解:DATA SEGMENT ARRAY DB 56,-42,66,87,0,88,-88,68,0,-67,58,97,-66,86,77 ;运行前置入具体数据COUNT EQU $-ARRAY XX DB 0 ;正数的个数 YY DB 0 ;0的个数 ZZ DB 0 ;负数的个数DATA ENDS CODE SEGMENT ASSUME CS: CODE, DS: DATA START: MOV AX, DATA MOV DS, AX
10、 LEA SI, ARRAY MOV CX, COUNT AGAIN: MOV AL, SI CMP AL, 0 ;分段测试 JGE L1 L0: INC ZZ JMP NEXT L1: JG L2 INC YY JMP NEXT L2: INC XX NEXT: ADD SI, 1 LOOP AGAINEXIT: MOV AX, 4C00H INT 21H CODE ENDS END START3.7 设有一个管理软件可接受十个键盘命令(分别是A、B、C,.,J),执行这十个命令的程序入口地址分别是PROCA、PROCB、PROCC,.,PROCJ。编写一程序从键盘上接收命令,并转去执行相应
11、的程序。要求分别用以下两种方式来实现:(1)用比较转移指令(2)用地址表法解:(1)DATA SEGMENT PROMPT DB 0DH, 0AH, INPUT A CHAR (AJ): $ MSGA DB 0DH, 0AH, FUNCTION A EXECUTED . $ MSGB DB 0DH, 0AH, FUNCTION B EXECUTED . $ MSGC DB 0DH, 0AH, FUNCTION C EXECUTED . $ MSGD DB 0DH, 0AH, FUNCTION D EXECUTED . $ MSGE DB 0DH, 0AH, FUNCTION E EXECUTE
12、D . $ MSGF DB 0DH, 0AH, FUNCTION F EXECUTED . $ MSGG DB 0DH, 0AH, FUNCTION G EXECUTED . $ MSGH DB 0DH, 0AH, FUNCTION H EXECUTED . $ MSGI DB 0DH, 0AH, FUNCTION I EXECUTED . $ MSGJ DB 0DH, 0AH, FUNCTION J EXECUTED . $DATA ENDSCODE SEGMENT ASSUME CS: CODE, DS: DATASTART: MOV AX, DATA MOV DS, AXINPUT: L
13、EA DX, PROMPT MOV AH, 9 INT 21H ;输出提示信息 MOV AH, 1 INT 21H ;输入一个数字; * 开始测试条件* CMP AL, A JB INPUT ;不在AJ内,重新输入 JE FA ;字符A,转FA CMP AL, B JE FB ;字符B,转FB CMP AL, C JE FC ;字符C,转FC CMP AL, D JE FD ;字符D,转FD CMP AL, E JE FE ;字符E,转FE CMP AL, F JE FF ;字符F,转FF CMP AL, G JE FG ;字符G,转FG CMP AL, H JE FH ;字符H,转FH CM
14、P AL, I JE FI ;字符I,转FI CMP AL, J JE FJ ;字符J,转FJ JMP INPUT ;大于J,重新输入; * 各分支语句序列*FA: CALL PROCA ;调用PROCA程序块 JMP EXIT ;每个分支结束,都要用JMP指令跳转到所有分支结束的地方FB: CALL PROCB ;调用PROCB程序块 JMP EXIT FC: CALL PROCC ;调用PROCC程序块 JMP EXIT FD: CALL PROCD ;调用PROCD程序块 JMP EXIT FE: CALL PROCE ;调用PROCE程序块 JMP EXIT FF: CALL PROC
15、F ;调用PROCF程序块 JMP EXIT FG: CALL PROCG ;调用PROCG程序块 JMP EXIT FH: CALL PROCH ;调用PROCH程序块 JMP EXIT FI: CALL PROCI ;调用PROCI程序块 JMP EXIT FJ: CALL PROCJ ;调用PROCJ程序块 JMP EXIT ;最后一个分支结束,JMP可以省略EXIT: MOV AX, 4C00H INT 21HPROCA PROC LEA DX, MSGA MOV AH, 9 INT 21H RETPROCA ENDPPROCB PROC LEA DX, MSGB MOV AH, 9
16、INT 21H RETPROCB ENDPPROCC PROC LEA DX, MSGC MOV AH, 9 INT 21H RETPROCC ENDPPROCD PROC LEA DX, MSGD MOV AH, 9 INT 21H RETPROCD ENDPPROCE PROC LEA DX, MSGE MOV AH, 9 INT 21H RETPROCE ENDPPROCF PROC LEA DX, MSGF MOV AH, 9 INT 21H RETPROCF ENDPPROCG PROC LEA DX, MSGG MOV AH, 9 INT 21H RETPROCG ENDPPROC
17、H PROC LEA DX, MSGH MOV AH, 9 INT 21H RETPROCH ENDPPROCI PROC LEA DX, MSGI MOV AH, 9 INT 21H RETPROCI ENDPPROCJ PROC LEA DX, MSGJ MOV AH, 9 INT 21H RETPROCJ ENDPCODE ENDS END START(2)DATA SEGMENT PROMPT DB 0DH, 0AH, INPUT A CHAR (AJ): $ MSGA DB 0DH, 0AH, FUNCTION A EXECUTED . $ MSGB DB 0DH, 0AH, FUN
18、CTION B EXECUTED . $ MSGC DB 0DH, 0AH, FUNCTION C EXECUTED . $ MSGD DB 0DH, 0AH, FUNCTION D EXECUTED . $ MSGE DB 0DH, 0AH, FUNCTION E EXECUTED . $ MSGF DB 0DH, 0AH, FUNCTION F EXECUTED . $ MSGG DB 0DH, 0AH, FUNCTION G EXECUTED . $ MSGH DB 0DH, 0AH, FUNCTION H EXECUTED . $ MSGI DB 0DH, 0AH, FUNCTION
19、I EXECUTED . $ MSGJ DB 0DH, 0AH, FUNCTION J EXECUTED . $ADDTBL DW FA,FB,FC,FD,FE,FF,FG,FH,FI,FJ;DATA ENDSCODE SEGMENT ASSUME CS: CODE, DS: DATASTART: MOV AX, DATA MOV DS, AXINPUT: LEA DX, PROMPT MOV AH, 9 INT 21H ;输出提示信息 MOV AH, 1 INT 21H ;输入一个数字 CMP AL, A JB INPUT ;不在AJ内,重新输入 CMP AL, J JA INPUT ;不在
20、AJ内,重新输入 SUB AL,A ;将数字字符“1”到“3”转换为0, 1, 2 SHL AL, 1 ;转换为0,2,4 MOV BL, AL MOV BH, 0 ;转入BX JMP ADDTBLBX ;间接寻址,转移到对应程序块 ; * 各分支语句序列*FA: LEA DX, MSGA ;FA程序块 JMP OUTPUT ;每个分支结束,都要用JMP指令跳转到所有分支结束的地方FB: LEA DX, MSGB ;FB程序块 JMP OUTPUT FC: LEA DX, MSGC ;FC程序块 JMP OUTPUT FD: LEA DX, MSGD ;FD程序块 JMP OUTPUT FE:
21、 LEA DX, MSGE ;FE程序块 JMP OUTPUT FF: LEA DX, MSGF ;FF程序块 JMP OUTPUT FG: LEA DX, MSGG ;FG程序块 JMP OUTPUT FH: LEA DX, MSGH ;FH程序块 JMP OUTPUT FI: LEA DX, MSGI ;FI程序块 JMP OUTPUT FJ: LEA DX, MSGJ ;FJ程序块 JMP OUTPUT ;最后一个分支结束,JMP可以省略OUTPUT: MOV AH, 9 INT 21H MOV AX, 4C00H INT 21HCODE ENDS END START3.8 设在寄存器A
22、X,BX,CX中存放的是16位无符号数,试编写程序段,找出三个数值居中的一个,并将其存入BUFF字单元中。解:DATA SEGMENT BUFF DW 0 DATA ENDSCODE SEGMENT ASSUME CS: CODE, DS: DATA START: MOV AX, DATA MOV DS, AX MOV AX,5 MOV BX,3 MOV CX,6 CMP AX,BX JA L1 JZ L2 L0: CMP AX,CX ;AXBX JAE L4 ;AXCX L2: CMP BX,CX JBE L5 JMP L6 L1: CMP BX,CX JAE L5 ;BX CMP AX,C
23、X JA L6 L4: MOV BUFF,AX JMP DONE L5: MOV BUFF,BX JMP DONE L6: MOV BUFF,CX DONE: MOV AX, 4C00H INT 21HCODE ENDS END START3.9 编写确定一个十进制数x(2x200)是否是素数(质数)的程序。解:DATA SEGMENTx DB 12 ;x(2x200)FLAG DB 0 ;X是素数,FLAG=1,否则FLAG=0DATA ENDSCODE SEGMENT ASSUME DS: DATA, CS: CODESTART: MOV AX, DATA MOV DS, AX MOV B
24、L,2 MOV BH,X SHR BH,1 ;计算测试范围 MOV FLAG,1 ;先假设x为素数NEXT: MOV AL,X MOV AH,0 DIV BL CMP AH,0 ;余数为0,说明不是素数,退出 JZ NO INC BL CMP BL,BH JZ EXIT ;到测试边界,退出 JMP NEXT NO: MOV FLAG,0 EXIT: MOV AX, 4C00H INT 21HCODE ENDS END START3.10 在以BLOCK为首地址的数据区域按着从小到大的顺序存放了一个年级(180人)学生的汇编语言成绩表。试编写程序将分数82插入到该数组合适的位置。解:DATA S
25、EGMENT BLOCK DB 1,3,5,7,9,12,15,25,35,36,37,40,42,46,57 ;学生的成绩表,可根据实际填写 ST DB 39 ;另外一个学生的成绩DATA ENDSCODE SEGMENT ASSUME CS: CODE, DS: DATA START: MOV AX, DATA MOV DS, AX LEA SI, BLOCK+14 ;取成绩表中最后一个学生成绩的偏移地址给SI MOV CX, 15 MOV AL, ST CMPBLK: CMP AL, SI ;要插入的学生成绩比成绩表中的成绩小,则转CHANGE JB CHANGE MOV SI+1,AL
26、 ;插入该学生成绩 JMP DONE CHANGE: MOV BL,SI ;把表中成绩后移 MOV SI+1,BL DEC SI LOOP CMPBLK DONE: MOV AX, 4C00H INT 21H CODE ENDS END START3.11 已知数组A中包含15个互不相等的整数,数据B中包含20个互不相等的整数,试编写一程序,将即在A数组中出现又在B数组中出现的整数存放于数组C中。解:DATA SEGMENT A DB 1,3,5,7,9,12,15,25,35,36,37,40,42,46,57 B DB 3,5,9,12,25,36,37,42,57,58,60,4,8,1
27、1,17,29,33,44,55,66 C DB 20 DUP (0)DATA ENDSCODE SEGMENT ASSUME CS: CODE, DS: DATA START: MOV AX, DATA MOV DS, AX MOV ES, AX LEA SI, A LEA BX, C MOV CX, 15 CLD CMPAB: LODSB ;从数组A中取出一个数 LEA DI, B PUSH CX MOV CX, 20 REPNZ SCASB ;与数组B中的元素比较 JNZ LOP ;数据不同,比较下一个数 MOV BX,AL ;数据相同,则保存在数组C中 INC BX LOP: POP CX LOOP CMPAB EXIT: MOV AX