这个程序很复杂,这个问题学会了,汇编语言也就基本过关了。
下面给出输入和原始顺序分数输出,重点说明结构数据的使用,供参考:
STUD STRUC
NO DB 10,?,10 DUP(?)
XM DB 20,?,20 DUP(?)
CJ DB 6,?,6 DUP(?)
SCORE DW ?
STUD_LEN EQU $-NO
STUD ENDS
DATA SEGMENT
STUDS STUD 100 dup(<>)
NUM DW 0
NOMSG DB 13,10,13,10,'please input the number of student: $'
XMMSG DB 13,10,'please input the name of student: $'
CJMSG DB 13,10,'please input the score of student: $'
CONTMSG DB 13,10,13,10,'Are you want to continue(y/n)? $'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA
START: MOV AX,SEG DATA
MOV DS,AX
MOV ES,AX
LEA DI,STUDS
@0:
LEA DX,NOMSG
MOV AH,9
INT 21H
LEA DX,[DI].NO
MOV AH,0AH
INT 21H
LEA DX,XMMSG
MOV AH,9
INT 21H
LEA DX,[DI].XM
MOV AH,10
INT 21H
LEA DX,CJMSG
MOV AH,9
INT 21H
LEA DX,[DI].CJ
MOV AH,10
INT 21H
; 以下计算score
MOV WORD PTR [DI].SCORE,0
LEA SI,[DI].CJ
MOV CL,[SI+1]
MOV CH,0
@@CJ:
MOV AX,[DI].SCORE
MOV BX,10
MUL BX
MOV DX,AX
MOV AL,[SI+2]
SUB AL,30H
MOV AH,0
ADD AX,DX
MOV [DI].SCORE,AX
INC SI
LOOP @@CJ
INC WORD PTR NUM
ADD DI,STUD_LEN
LEA DX,CONTMSG
MOV AH,9
INT 21H
MOV AH,1
INT 21H
CMP AL,'n'
JE @2
JMP @0
@2:
MOV AH,2
MOV DL,13
INT 21H
MOV DL,10
INT 21H
MOV CX,NUM
LEA DI,STUDS
@@OUT:
MOV AX,[DI].SCORE
CALL DISPAX
ADD DI,STUD_LEN
LOOP @@OUT
@EXIT:
MOV AH,4CH
INT 21H
;==============================================
DISPAX PROC NEAR
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DS
PUSH AX
MOV AH,2
MOV DL,' '
INT 21H
POP AX
PUSH CS
POP DS
MOV BYTE PTR NZ,0
PUSH AX
LEA SI,DIVARR
MOV CX,5
@@1:
POP AX
MOV DX,0
MOV BX,[SI]
DIV BX
PUSH DX
CMP AL,0
JNE @@2
CMP BYTE PTR NZ,1
JE @@2
CMP CX,1
JE @@2
MOV DL,20H
JMP @@3
@@2:
ADD AL,30H
MOV DL,AL
MOV BYTE PTR NZ,1
@@3:
MOV AH,2
INT 21H
INC SI
INC SI
LOOP @@1
POP DX
POP DS
POP SI
POP DX
POP CX
POP BX
RET
DIVARR DW 10000,1000,100,10,1
NZ DB 0
DISPAX ENDP
;===============================================
CODE ENDS
END START
建议编制这些子程序:串结构数组排序子程序、串结构数据交换子程序