21,459
社区成员
发帖
与我相关
我的任务
分享
main proc far ; 定义为 far,以使 ret 实际为 retf 指令
push ds ;程序开始时 ds 指向 psp
mov ax, 0
push ax
...
ret ; 返回到 psp:0000 处, 那里是个 int20h 指令, 也可以实现 "结束程序返回DOS" 的功能
; ^ int20h 要求调用时 cs 指向 psp, 所以一般不能直接调用
main endp
NAME EX2
PUBLIC DATA1
EXTRN MAX_GRADE:FAR ,MIN_GRADE:FAR,SUM_AVER:FAR ,DISPLAY_DEC:FAR
DATA SEGMENT PARA 'DATA'
KEY_BUF DB 2 DUP(?)
DATA1 DB 4 DUP(?)
DATA ENDS
STACK SEGMENT PARA STACK 'STA'
DW 200 DUP(?)
STACK ENDS
CODE SEGMENT PARA 'CODE'
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
MAIN PROC FAR
START:MOV DI,OFFSET DATA1
MOV BH,4
FLAG1:MOV SI,OFFSET KEY_BUF
MOV BL,0
LOP1:
MOV AH,1
INT 21H
CMP AL,' '
JZ FLAG2
MOV [SI],AL
INC SI
INC BL
JMP LOP1
FLAG2:
MOV SI,OFFSET KEY_BUF
MOV AX,0
TRANS:
MOV DL,10
MUL DL
MOV DH,0
MOV DL,[SI]
AND DL,0FH
ADD AL,DL
INC SI
DEC BL
JNZ TRANS
MOV [DI],AL
INC DI
DEC BH
JNZ FLAG1
CALL MAX_GRADE
CALL MIN_GRADE
CALL SUM_AVER
MOV AH,4CH
INT 21H
MAIN ENDP
CODE ENDS
END START
NAME EX21
EXTRN DATA1:BYTE,DISPLAY_DEC:FAR
PUBLIC MAX_GRADE
CODE SEGMENT PARA 'CODE'
ASSUME CS:CODE
MAX_GRADE PROC FAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV SI,OFFSET DATA1
MOV CX,3
MOV AL,[SI]
L1:INC SI
CMP AL,[SI]
JAE L2
MOV AL,[SI]
L2:LOOP L1
CALL DISPLAY_DEC
CALL SPACE
POP DX
POP CX
POP BX
POP AX
RET
MAX_GRADE ENDP
INCLUDE SPACE.ASM
CODE ENDS
END
NAME EX22
EXTRN DATA1:BYTE,DISPLAY_DEC:FAR
PUBLIC MIN_GRADE
CODE SEGMENT PARA 'CODE'
ASSUME CS:CODE
MIN_GRADE PROC FAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV SI,OFFSET DATA1
MOV CX,3
MOV AL,[SI]
L1:INC SI
CMP AL,[SI]
JBE L2
MOV AL,[SI]
L2:LOOP L1
CALL DISPLAY_DEC
CALL SPACE
POP DX
POP CX
POP BX
POP AX
RET
MIN_GRADE ENDP
INCLUDE SPACE.ASM
CODE ENDS
END
NAME EX23
EXTRN DATA1:BYTE,DISPLAY_DEC:FAR
PUBLIC SUM_AVER
CODE SEGMENT PARA 'CODE'
ASSUME CS:CODE
SUM_AVER PROC FAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV SI,OFFSET DATA1
MOV CX,4
MOV AX,0
MOV BX,0
L3:MOV BL,[SI]
ADC AX,BX
INC SI
LOOP L3
CALL DISPLAY_DEC
CALL SPACE
MOV BL,4
DIV BL
CALL DISPLAY_DEC
PUSH AX
PUSH BX
PUSH DX
MOV DL,2EH
MOV AH,2
INT 21H
POP DX
POP BX
POP AX
MOV CX,2
LOP5:CMP AH,0
JZ EXIT
MOV AL,AH
MOV BH,10
MUL BH
DIV BL
CALL DISPLAY_DEC
LOOP LOP5
EXIT:
POP DX
POP CX
POP BX
POP AX
RET
SUM_AVER ENDP
INCLUDE SPACE.ASM
CODE ENDS
END
NAME EX24
PUBLIC DISPLAY_DEC
DATA SEGMENT PARA'DATA'
STR DB 5 DUP('0')
DATA ENDS
CODE SEGMENT PARA 'CODE'
ASSUME CS:CODE
DISPLAY_DEC PROC FAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV SI,OFFSET STR
MOV BH,0
CMP AL,0
JNZ F1
MOV DL,30H
MOV AH,2
INT 21H
POP DX
POP CX
POP BX
POP AX
RET
F1:MOV BL,10
MOV AH,0
DIV BL
MOV DL,AH
ADD DL,30H
MOV [SI],DL
INC SI
INC BH
CMP AL,0
JZ F2
JMP F1
F2: MOV DL,[SI-1]
MOV AH,2
INT 21H
DEC SI
DEC BH
JNZ F2
POP DX
POP CX
POP BX
POP AX
RET
DISPLAY_DEC ENDP
CODE ENDS
END
SPACE PROC
PUSH AX
PUSH DX
MOV DL,' '
MOV AH,2
INT 21H
POP DX
POP AX
RET
SPACE ENDP