6.4 分析下面的程序,写出堆栈最满时各单元的地址及内容。 ;******************************************** STACK SEGMENT AT 500H ;定义堆栈段 DW 128 DUP (?) TOS LABEL WORD STACK ENDS
;******************************************** CODE SEGMENT ;定义代码段 MAIN PROC FAR ;主程序部分 ASSUME CS: CODE, SS: STACK START: MOV AX, STACK MOV SS, AX MOV SP, OFFSET TOS PUSH DS SUB AX, AX PUSH AX
;MAIN PART OF PROGRAM GOES HERE MOV AX, 4321H CALL HTOA RET
MAIN ENDP ;主程序部分结束
;-------------------------------------------------------------------- HTOA PROC NEAR ;HTOA子程序 CMP AX, 15
11 / 16
JLE B1 PUSH AX PUSH BP MOV BP, SP MOV BX, [BP+2] AND BX, 000FH MOV [BP+2], BX POP BP MOV CL, 4 SHR AX, CL CALL HTOA POP AX
B1: ADD AL, 30H CMP AL, 3AH JL PRINTIT ADD AL, 7H
PRINTIT: MOV DL, AL MOV AH, 2 INT 21H RET
HOTA ENDP ;HOTA子程序结束
;-------------------------------------------------------------------- CODE ENDS ;代码段结束
;******************************************
12 / 16
END START ;程序结束;******************************************** 500:00EC 500:00EE 500:00F0 500:00F2 500:00F4 500:00F6 500:00F8 500:00FA 500:00FC 500:00FE SP: IP 0003H IP 0002H IP 0001H IP 0000 (DS) 00EE
6.7 设有10个学生的成绩分别是76,69,84,90,73,88,99,63,100和80分。试编制一个子程序统计60~69分,70~79分,80~89分,90~99分和100分的人数,分别存放到S6,S7,S8,S9和S10单元中。 答:程序如下: DSEG SEGMENT
RECORD DW 76,69,84,90,73,88,99,63,100,80 S6 DW 0 S7 DW 0 S8 DW 0 S9 DW 0 S10 DW 0 DSEG ENDS
;****************************************** CSEG SEGMENT MAIN PROC FAR
ASSUME CS: CSEG, DS: DSEG
START: PUSH DS ;设置返回DOS SUB AX, AX PUSH AX
13 / 16
MOV AX, DSEG
MOV DS, AX ;给DS赋值 BEGIN: MOV CX, 10 CALL COUNT
┇ ;后续程序 RET
MAIN ENDP
;-------------------------------------------------------------------------- COUNT PROC NEAR ;成绩统计子程序 MOV SI, 0
NEXT: MOV AX, RECORD[SI]
MOV BX, 10 ;以下5句是根据成绩计算相对S6的地址变化量 DIV BL ;计算公式为:((成绩)/10-6)*2送(BX) MOV BL, AL ;此时(BH)保持为0不变 SUB BX, 6 ;应为只统计60分以上成绩 SAL BX, 1 ;(BX)*2
INC S6[BX] ;S6是S6,S7,S8,S9和S10单元的首地址 ADD SI, 2 LOOP NEXT RET
COUNT ENDP ;COUNT子程序结束
;-------------------------------------------------------------------------- CSEG ENDS ;以上定义代码段
;****************************************** END START
7.3 给定宏定义如下:(注意:此宏指令的功能是V3←|V1-V2|) DIF MACRO X, Y MOV AX, X SUB AX, Y ENDM
ABSDIF MACRO V1, V2, V3 LOCAL CONT PUSH AX DIF V1, V2 CMP AX, 0 JGE CONT NEG AX
CONT: MOV V3, AX POP AX ENDM
试展开以下调用,并判定调用是否有效。 (1) ABSDIF P1, P2, DISTANCE
14 / 16
(2) ABSDIF [BX], [SI], X[DI], CX
(3) ABSDIF [BX][SI], X[BX][SI], 240H (4) ABSDIF AX, AX, AX
答:答:(1) 宏调用 ABSDIF P1, P2, DISTANCE 的宏展开如下:此宏调用有效。 1 PUSH AX 1 DIF P1, P2 1 MOV AX, P1 1 SUB AX, P2 1 CMP AX, 0 1 JGE ??0000 1 NEG AX
1 ??0000: MOV DISTANCE, AX 1 POP AX
(2) 宏调用 ABSDIF [BX], [SI], X[DI], CX 的宏展开如下:此宏调用有效。 1 PUSH AX 1 DIF [BX], [SI] 1 MOV AX, [BX] 1 SUB AX, [SI] 1 CMP AX, 0 1 JGE ??0001 1 NEG AX
1 ??0001: MOV X[DI], AX 1 POP AX
(3) 宏调用 ABSDIF [BX][SI], X[BX][SI], 240H 的宏展开如下:此宏调用无效。 1 PUSH AX
1 DIF [BX][SI], X[BX][SI] 1 MOV AX, [BX][SI] 1 SUB AX, X[BX][SI] 1 CMP AX, 0 1 JGE ??0002 1 NEG AX
1 ??0002: MOV 240H, AX 1 POP AX
(4) 宏调用 ABSDIF AX, AX, AX 的宏展开如下:此宏调用有效但无多大意义。 1 PUSH AX 1 DIF AX, AX 1 MOV AX, AX 1 SUB AX, AX 1 CMP AX, 0 1 JGE ??0003 1 NEG AX
1 ??0003: MOV AX, AX 1 POP AX
15 / 16
7.5 宏指令BIN_SUB完成多个字节数据连减的功能: RESULT←(A-B-C-D-…)
要相减的字节数据顺序存放在首地址为OPERAND的数据区中,减数的个数存放在COUNT单元中,最后结果存入RESULT单元。请编写此宏指令。 答:宏定义如下:
BIN_SUB MACRO RESULT, A, OPERAND, COUNT LOCAL NEXT_SUB PUSH CX PUSH BX PUSH AX
MOV CX, COUNT MOV AL, A
LEA BX, OPERAND CLC
NEXT_SUB: SBB AL, [BX] INC BX
LOOP NEXT_SUB MOV RESULT, AL POP AX POP BX POP CX ENDM
7.7 下面的宏指令CNT和INC1完成相继字存储。 CNT MACRO A, B A&B DW ? ENDM
INC1 MACRO A, B CNT A, %B B=B+1 ENDM
请展开下列宏调用: C=0
INC1 DATA, C INC1 DATA, C
答:宏展开如下: C=0
INC1 DATA, C 1 DATA0 DW ? INC1 DATA, C
1 DATA0 DW ? (注意:C为0没有变)
16 / 16
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库汇编考试重点20题 docx(3)在线全文阅读。
相关推荐: