1、新编汇编语言程序设计四五章习题参考解答习题四4.5 已知(AX)= 836BH,X分别取下列值,执行“CMP AX, X”后,标志位ZF、CF、OF、SF各是什么?(1)X=3000H (2)X=8000H (3)X=7FFFFH (4)X=0FFFFH (5)X=0答:上述指令执行后,标志位ZF、CF、OF、SF 的状态分别是: (1) ZCOS=0010 (2) ZCOS=0000 (3) ZCOS=0010 (4) ZCOS=0101 (5) ZCOS=00014.7 测试名为X的一个字节,如果X的第1,3位均为1,转移到L1,如果只有一位为1,转移到L2,如果两位全为0,转移到L3。写
2、出对应的指令序列。答: MOV AL, X AND AL, 0000 1010B JZ L3 CMP AL, 0000 1010B JE L1 JMP L24.12 计算分段函数: X的值从键盘输入,Y的值送显示器输出。答: INCLUDE YLIB.H DATA SEGEMNT MESS1 DB 0DH, 0AH, Input value of X please : $ MESS2 DB 0DH, 0AH, Y= : $DATA ENDS CODE SEGMENT ASSUME CS: CODE, DS: DATA START: MOV AX, DATA MOV DS, AX LEA DX,
3、 MESS1CALL READINT ;输入X的值CMP AX, -2JGE L2 L1: SUB AX, 3 ;AXX-3 JMP DONE L2: CMP AX, 3 JG L3 MOV BX, AX ADD AX, AX ;AX2X ADD AX, AX ;AX4X ADD AX, BX ;AX5X ADD AX, 6 ;AX5X+6 JMP DONE L3: MOV AX, 2 ;AX2 DONE: LEA DX, MESS2CALL WRITEINT ;输出Y的值CALL CRLF MOV AX, 4C00H INT 21H CODE ENDS END START4.14 编写程序,
4、求10元素字数组LIST中绝对值最小的数,存入MIN单元。答: DATA SEGEMNT LIST DW -56, +12, 88, -126, -5, 16, 32, -99, 72, -18 MIN DW ? MINABS DW ?DATA ENDS CODE SEGMENT ASSUME CS: CODE, DS: DATA START: MOV AX, DATA MOV DS, AX MOV AX, LIST MOV MIN, AX ;将数组第一个元素假设为绝对值最小的数MOV MINABS, 32767 ;最小的绝对值假设为32767LEA SI, LISTMOV CX, 10 AG
5、AIN: MOV AX, SICMP AX, 0JGE SKIP1NEG AX ;求绝对值 SKIP1: CMP AX, MINABS ;绝对值与假设的最小绝对值比较 JGE SKIP2 ;假设的绝对值较小,跳过 MOV MINABS, AX ;保存新的最小绝对值MOV AX, SI ;取出新的绝对值最小的数MOV MIN, AX ;保留新的绝对值最小的数 SKIP2: ADD SI, 2 LOOP AGAINMOV AX, 4C00H INT 21H CODE ENDS END START说明:一定要预设最小的绝对值和绝对值最小的数,而且这个绝对值最小的数必须来自LIST数组。4.16 一个
6、有符号字数组以0为结束标志,求这个数组的:最大值、最小值、平均值。答: DATA SEGEMNT LIST DW -56, +12, 88, -126, -5, 16, 32, -99, 72, -18, 0 MIN DW ? MAX DW ? AVG DW ?DATA ENDS CODE SEGMENT ASSUME CS: CODE, DS: DATA START: MOV AX, DATA MOV DS, AX MOV MIN, 32767 ;将32767假设为最小的数MOV MAX, -32768 ;将-32768假设为最大的数MOV AVG, 0 ;AVG用作累加器,清零LEA SI
7、, LISTMOV CX, 0 AGAIN: MOV AX, SICMP AX, 0JZ DONE ;找到零元素,转DONE结束处理INC CX ;纪录非零元素个数ADD AVG, AX ;累加CMP AX, MINJGE SKIP1MOV MIN. AX ;比预设最小值还小,保留SKIP1: CMP AX, MAXJLE SKIP2 MOV MAX, AX ;比预设最大值还大,保留 SKIP2: ADD SI, 2 JMP AGAIN DONE: JCXZ NULL ;元素个数为零,转NULL处理 MOV AX, AVG CWD IDIV CX MOV AVG, AX ;计算平均值 JMP
8、EXIT NULL: MOV MIN, 0 ;元素个数为0,将“最大值”、“最小值” MOV MAX, 0 ;“平均值”清零 MOV AVG, 0EXIT: MOV AX, 4C00H INT 21H CODE ENDS END START4.21编写程序,把一个30个元素的有符号字数组ARRAY按照各元素的正负分别送入数组P和M,正数和零元素送P数组,负数送M数组。答: DATA SEGEMNT ARRAY DW 30 DUP(?) ;汇编之前置入数据 P DW 30 DUP(?) M DW 30 DUP(?) DATA ENDS CODE SEGMENT ASSUME CS: CODE,
9、DS: DATA START: MOV AX, DATA MOV DS, AX LEA BX, ARRAY ;ARRAY数组指针 MOV SI, 0 ;P数组指针 MOV DI, 0 ;M数组指针 MOV CX, 30 ONE: MOV AX, BX ;从ARRAY数组取出一个数据 AND AX, AL JGE PLUS ;正数、零转PLUS MINUS: MOV MDI, AX ;负数存入M数组 ADD DI, 2 JMP NEXT PLUS: MOV PSI, AX ;正数、零存入P数组 ADD SI, 2 NEXT: ADD BX, 2 LOOP ONE MOV AX, 4C00H IN
10、T 21H CODE ENDS END START4.30 编写程序,输入N,计算:S=1*2+2*3+(N-1)*N 答: INCLUDE YLIB.HCODE SEGMENT ASSUME CS: CODE MESS1 DB 0DH, 0AH, Input N please: $ MESS2 DB 0DH, 0AH, S= $ START: PUSH CS POP DSLEA DX, MESS1CALL READDEC ;输入NMOV CX, AXXOR BX, BX ;BX用作累加器 ONE: MOV AX, CX MOV SI, AX DEC SI MUL SI ;计算J*(J-1)
11、ADD BX, AX ;累加 LOOP ONE LEA DX, MESS2 MOV AX, BX CALL WRITEDEC ;输出结果 CALL CRLF MOV AX, 4C00H INT 21H CODE ENDS END START4.31 编写程序,输入N,输出如下矩阵(设N=5)1 1 1 1 12 2 2 2 13 3 3 2 14 4 3 2 15 4 3 2 1答:设I为行(15), J为列(15),则(I, J)位置上的数据为:I(6-J)? I: 6-J 。INCLUDE YLIB.HCODE SEGMENT ASSUME CS: CODE START:CALL CRLF
12、MOV SI, 1 ;SI为行号 ROW: MOV CX, 5 ;CX为6-列号 COL: CMP SI, CX ;判断当前位置 JB UP DOWN: MOV AX, CX ;下半三角,取6-列号 JMP OUTPUT UP: MOV AX, SI ;上半三角,取行号 OUTPUT: MOV DX, -1 CALL WRITEDEC ;输出一个数据 LOOP COL CALL CRLF ;结束本行 INC SI ;修改行号 CMP SI, 5 JBE ROW ;未满5行,继续 MOV AX, 4C00H INT 21H CODE ENDS END START习题五5.4 阅读下面的程序,指出
13、该程序计划完成的功能,同时指出程序中尚存在的错误。 CODE SEGMENT ASSUME: CS: CODE START: MOV CX, 20 LOOP0: CALL PRINTSPACE LOOP LOOP0 MOV AH, 4CH INT 21H PRINTSPACE PROC NEAR MOV CX, 40 ;该行上面添加:PUSH CX PSLOOP:MOV AL, MOV AH, 02H INT 21H LOOP PSLOOP MOV AL, 0AH MOV AH, 02H INT 21HMOV AL, 0DH MOV AH, 02H INT 21H ; 该行下面添加:POP C
14、X RET PRINTSPACE ENDPCODE ENDS END START功能:输出20行空行,每行有40个空格。5.6 阅读下面的子程序,叙述它完成的功能,它的入口参数和出口参数各是什么?CLSCREEN PROCMOV AX, 0600H MOV CX, 0MOV DH, XMOV DL, YMOV BH, 07HINT 10HRETCLSCREEN ENDP解:屏幕窗口上卷,左上角为(0,0),右下角为(y, x),卷入行属性为黑底白字。5.7 编写程序,键入一个以$为结束符的数字串,统计其中“0”“9”各个数字出现的次数,分别存放到S0S9这10个单元中去。解:.MODEL SM
15、ALL .DATA S0 DB 0 S1 DB ?S2 DB 0S3 DB 0S4 DB 0S5 DB 0S6 DB 0S7 DB 0S8 DB 0 S9 DB 0 KEYIN DB 100 DUP(0) .CODE START: MOV AX, DATA MOV DS, AX MOV CX, 0 LEA BX, KEYIN NEXT: MOV AH, 01H INT 21H CMP AL, $ JZ COUNT INC CX MOV BX, AL INC BX JMP NEXT COUNT: LEA BX, KEYIN COUNT1:LEA DI, S0 MOV AL, BX SUB AL,
16、 30H MOV AH, 0 ADD DI, AX INC BYTE PTRDI INC BX LOOP COUNT1 MOV AX, 4C00H INT 21H END START5.8 下面程序求某数据区中无符号数据最大值,观察程序执行中堆栈变化,画出以下5个堆栈状态图。(1)CALL MAX指令执行之前(2)CALL MAX指令执行之后。(3)保护现场之前(4)恢复现场之后(5)执行指令POP SMAX之后程序清单如下:DATA SEGMENTBUF DW 98, 34, 897, 345, 678, 21345, 67, 2COUNT EQU ($-BUF) / 2SMAX DW ?D
17、ATA ENDSCODE SEGMENTASSUME CS: CODE, DS: DATASTART: MOV AX, DATA MOV DS, AX LEA AX, BUF ; 入口参数进栈 PUSH AX MOV AX, COUNT PUSH AX CALL MAX POP SMAX ; 最大值出栈,送SMAX MOV AH, 4CH INT 21HMAX PROC PUSH BP MOV BP, SP MOV SI, BP+6 ; BUF的偏移地址送SI MOV CX, BP+4 ; COUNT送CX MOV BX, SI ; 取第一个数据至BX DEC CXMAX1: ADD SI,
18、2 CMP BX, SI JAE NEXTMOV AX, SI ; 取第二个数至AXNEXT: LOOP MAX1 MOV BP+6, BX ; 最大值进栈POP BPRET 2 ; 返回后SP指向最大值MAX ENDPCODE ENDS END STARTSP返回偏移地址COUNTBUF的偏移地址CALL MAX执行之后SPCOUNTBUF的偏移地址CALL MAX执行之前 SP返回偏移地址COUNTBUF的偏移地址保护现场之前 BPSP返回偏移地址COUNT最大值恢复现场之后BP返回偏移地址COUNTSP最大值执行RET 2之后5.9 编写求绝对值的子程序,利用它计算三个变量的绝对值之和。
19、解:.MODEL SMALL.DATAVALUE DW -5, 5, -10SUM DW 0.CODESTART: MOV AX, DATA MOV DS, AX LEA BX, VALUE MOV CX, 3 MOV SUM, 0 ONE: CALL ABS ADD SUM, AX ADD BX, 2 LOOP ONE MOV AX, 4C00H INT 21H ; 子程序ABS ; 功能:求一个字整数的绝对值 ; 入口:字整数的偏移地址在BX中 ; 出口:该字整数的绝对值在AX中ABS PROC MOV SUM, 0AGAIN: MOV AX, BX AND AX, AX JGE SKIP
20、 NEG AXSKIP: RETABS ENDPEND START5.10 子程序计算从2开始的N(N50)个偶数之和(246),主程序从键盘输入整数N,调用子程序求出N个偶数之和,并显示结果。用以下3种方法编写完整程序。(1)子程序和主程序在同一代码段。(2)在同一模块(源程序文件),但不在同一代码段。(3)各自独立成模块,即在不同的源程序文件中。解:(1)INCLUDE YLIB.H.MODEL SMALL.DATASUM DW 0PROMPT1 DB 0DH, 0AH, INPUT THE NUMBER N:$PROMPT2 DB 0DH, 0AH, THE SUM IS :$.CODE
21、START: MOV AX, DATA MOV DS, AX LEA DX, PROMPT1 CALL READDEC CMP AX, 0 JZ EXIT MOV CX, AX CALL SUMM LEA DX, PROMPT2 CALL WRITEDEC CALL CRLFEXIT: MOV AX, 4C00H INT 21HSUMM PROC MOV AX, 0NEXT: MOV BX, CX ADD BX, BX ADD AX, BX LOOP NEXT RET SUMM ENDPEND START(2)INCLUDE YLIB.HDATA SEGMENTSUM DW 0PROMPT1
22、DB 0DH, 0AH, INPUT THE NUMBER:$PROMPT2 DB 0DH, 0AH, THE SUM IS:$DATA ENDSCODE1 SEGMENTASSUME DS: DATA, CS: CODE1START: MOV AX, DATA MOV DS, AX LEA DX, PROMPT1 CALL READDEC CMP AX, 0 JZ EXIT MOV CX, AX CALL FAR PTR SUMM LEA DX, PROMPT2 CALL WRITEDEC CALL CRLFEXIT: MOV AX, 4C00H INT 21HCODE1 ENDSCODE2
23、 SEGMENTASSUME CS: CODE2, DS: DATASUMM PROC FAR MOV AX, 0NEXT: MOV BX, CX ADD BX, BX ADD AX, BX LOOP NEXT RET SUMM ENDP CODE2 ENDSEND START(3); EXEC5103A.ASMPUBLIC SUMMCODE2 SEGMENTASSUME CS: CODE2SUMM PROC FAR MOV AX, 0NEXT: MOV BX, CX ADD BX, BX ADD AX, BX LOOP NEXT RET SUMM ENDPCODE2 ENDS END; EX
24、EC5103B.ASMINCLUDE YLIB.HEXTRN SUMMDATA SEGMENTSUM DW 0PROMPT1 DB 0DH, 0AH, INPUT THE NUMBER:$PROMPT2 DB 0DH, 0AH, THE SUM IS:$DATA ENDSCODE1 SEGMENTASSUME DS: DATA, CS: CODE1START: MOV AX, DATA MOV DS, AX LEA DX, PROMPT1 CALL READDEC CMP AX, 0 JZ EXIT MOV CX, AX CALL FAR PTR SUMM LEA DX, PROMPT2 CA
25、LL WRITEDEC CALL CRLFEXIT: MOV AX, 4C00H INT 21HCODE1 ENDSEND START5.19 编写排序子程序SORT,以DS、SI和CX作为入口参数,把DS:SI为起始地址的一个带符号的字数组进行由小到大排序,参数CX中存放的是数组中元素个数。解:DATAREA SEGMENTARRAY DW 1, 9, 6, 8, 5, 4CNT DW 6ADDR DW ?DATAREA ENDSCODE SEGMENTASSUME CS: CODE, DS: DATAREASTART: MOV AX, DATAREA MOV DS, AX LEA SI,
26、ARRAY MOV CX, CNT CALL SORT MOV AX, 4C00H INT 21HSORT PROC PUSH CX PUSH AX PUSH BX PUSH SIINIT: MOV BX, 1 DEC CX JZ SORTED PUSH SI PUSH CXNEXT: MOV AX, SICMP SI+2, AX JGE CONT XCHG SI+2, AX MOV SI, AX XOR BX, BX ; 置交换标志CONT: ADD SI, 2LOOP NEXTPOP SIPOP CX CMP BX, 0 JE INITSORTED: POP SIPOP BX POP AX POP CX RETSORT ENDPCODE ENDSEND S
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1