匯編語言學生成績
A. 用匯編語言用匯編語言編寫從鍵盤上輸入N個學生的成績,然後按成績降序輸出顯示各學生的成績。
學生成績輸出時是先輸出成績,再輸出其序號。
CODESEGMENT
ASSUMECS:CODE
ORG100H
START:PUSHCS
POPDS
PUSHCS
POPES
CALLINPUTNUM
MOVAH,2
MOVDL,13
INT21H
MOVDL,10
INT21H
LEASI,@ARRAY
LEABP,@XUHAO
MOVCX,@NUM
CALLSORTWORD
LEASI,@ARRAY
LEABX,@XUHAO
MOVCX,@NUM
CLD
@1:
LODSW
CALLDSPAXS
MOVAX,[BX]
CALLDSPAXS
INCBX
INCBX
MOVAH,2
MOVDL,13
INT21H
MOVDL,10
INT21H
LOOP@1
MOVAH,4CH
INT21H
;===============================================
;鍵盤輸入數值數組子程序(數組名為@array,元素個數存放在@num中)
;可以是負數
;採用字元串緩沖方式輸入
INPUTNUMPROCNEAR
PUSHAX
PUSHBX
PUSHCX
PUSHDX
PUSHSI
PUSHDI
PUSHF
;對數組@array清零
MOVCX,100
MOVAX,0
LEADI,@ARRAY
CLD
REPSTOSW
;;;;;;;;;;;;;;;;;;;;;;;;;;;;初始化序號數組
MOVCX,100
MOVAX,1
LEADI,@XUHAO
@WXUHAO:
STOSW
INCAX
LOOP@WXUHAO
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOVWORDPTR@NUM,0
;輸入的數據以一個空格分隔,以回車符結束輸入
LEADX,@STRA
MOVAH,10
INT21H
MOVCL,@STRN
MOVCH,0
MOVWORDPTR@STRM,CX
LEASI,@STR
CLD
LEADI,@ARRAY;將數組第一個元素的有效地址置入DI
MOVWORDPTR@NUM,0
@STIN:
MOVAX,0
PUSHAX
MOVBYTEPTR@SIGNN,0
@AGAIN1:
CMPWORDPTR@STRM,0
JE@LINE0
LODSB
DECWORDPTR@STRM
CMPAL,''
JE@LINE0
CMPAL,'-'
JNE@INPUT1
MOVBYTEPTR@SIGNN,1
JMP@AGAIN1
@INPUT1:
SUBAL,30H
MOVAH,0
MOVBX,AX
POPAX
MOVCL,10
MOVCH,0
MULCX
ADDAX,BX
PUSHAX
JMP@AGAIN1
@LINE0:
POPAX
CMPBYTEPTR@SIGNN,1
JNE@INPUT2
NEGAX
@INPUT2:
MOVWORDPTR[DI],AX
INCWORDPTR@NUM
CMPWORDPTR@STRM,0
JE@STINEND
INCDI
INCDI
JMP@STIN
@STINEND:
POPF
POPDI
POPSI
POPDX
POPCX
POPBX
POPAX
RET
@STRADB255
@STRNDB?
@STRDB255DUP(?)
@STRMDW0
@ARRAYDW100DUP(0)
@NUMDW0
@CHARDB?
@SIGNNDB0
@XUHAODW100DUP(0)
INPUTNUMENDP
;===============================
;字數組排序(有符號數冒泡排序)
SORTWORDPROCNEAR
;數組長度置入cx,字數組首地址置入si,序號數組首地址置入bp
PUSHAX
PUSHBX
PUSHCX
PUSHDX
PUSHSI
PUSHDI
PUSHBP
PUSHF
PUSHCX
POPDX
DECDX
@SORTWL1:
MOVCX,DX
MOVDI,SI
MOVBX,BP
@SORTWL2:
MOVAX,[DI+2]
CMPAX,[DI]
JL@SORTWNEXT;從大到小(無符號換成JB)
XCHGAX,[DI]
MOV[DI+2],AX
;====================
MOVAX,[BX+2]
XCHGAX,[BX]
MOV[BX+2],AX
;====================
@SORTWNEXT:
INCDI
INCDI
INCBX
INCBX
LOOP@SORTWL2
DECDX
JNZ@SORTWL1
POPF
POPBP
POPDI
POPSI
POPDX
POPCX
POPBX
POPAX
RET
SORTWORDENDP
;=================================
DSPAXSPROCNEAR
PUSHAX
TESTAX,8000H
JNS@DSPAXS1
PUSHAX
PUSHDX
MOVAH,2
MOVDL,'-'
INT21H
POPDX
POPAX
NEGAX
@DSPAXS1:
CALLDSPAX
POPAX
RET
DSPAXSENDP
;===============================
DSPAXPROCNEAR
PUSHAX
PUSHBX
PUSHCX
PUSHDX
PUSHF
XORCX,CX
MOVBX,10
@DSPAX1:
XORDX,DX
DIVBX
INCCX
ORDX,30H
PUSHDX
CMPAX,0
JNE@DSPAX1
MOVAH,2
@DISPAX2:
POPDX
INT21H
LOOP@DISPAX2
MOVDL,32
INT21H
POPF
POPDX
POPCX
POPBX
POPAX
RET
DSPAXENDP
;==================================
CODEENDS
ENDSTART
B. 匯編語言學生成績排序
===緩沖區抄定義的例子===
BUF DB '256489713'
?EQU $-BUF
; ===起泡沫排序的代碼示例===
LEA SI,BUF緩沖區地址
MOV CX,N的排序緩沖區的值的數目?
sss_lp1:
DEC CX BR /> JZ sss_out
推SI
推CX
sss_lp2:
MOV AL,[SI]
CMP AL,[SI +1]
JC sss_next
XCHG人[州市+1]
MOV [SI],AL
sss_next:
INC SI
循環sss_lp2
彈出CX
> POP SI
JMP sss_lp1
sss_out:;完成出口處,
C. 匯編語言實驗 學生成績名次表
課後題,我
30之間的數字0 - 100D中存儲的地址GRADE為首的30陣列
級+1的學生數i + 1個學生的成績。另一個數組RANK 30
;學生的名次,其中RANK +我的學生我+1內容的學生人數的排名。寫一個程序,根據學生的成績等級說話的學生排名填充的RANK陣列
(提示:學生得分高於數字加1)等於一個學生排名
DATAS分部
;輸入的數據段代碼
級DW 88,75,95,63,98,78,87,78,90,60;定義;結果
COUNT EQU($-GRADE)/ 2
> RANK DW COUNT DUP(1)排名中,初始值為1,首先,在同一起跑線上哈
DATAS結束
的STACKS分類
這里進入堆棧段碼
STACKS ENDS
代碼另一個矩形
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS MOV DS,AX
這里輸入的代碼段代碼
MOV SI,0;學生把數
MOV CX,COUNT
L1:在
MOV AX,GRADE [SI]訪問學生成績SI號
RANK MOV BX,[SI];初步排名SI號學生
MOV DX, CX CX;保存
MOV DI,0;學生的比較數字
MOV CX,COUNT
L2:
CMP AX,GRADE [DI];比較蘋果,蘋果
> JNB L3
INC BX;以下學生的成績,排名加1
L3:
ADD DI,2
LOOP L2
MOV RANK [ SI],BX;保存排名
ADD SI,2
MOV CX,DX
LOOP L1
MOV AH,4CH
INT 21H
> CODES ENDS END START
D. 求用匯編語言 解決10個學生的平均成績
data segment
buff db 30p(?);換成學生成績
word0 db 0ah,0dh
db 'the thirty scores are:','$'
word1 db 0ah,0dh
db 'average scores is:','$'
data ends
code segment
assume cs:code ,ds:data
start:mov ax,data
mov ds,ax
mov dx,offset word0
mov ah,9
int 21h
mov dx,offset buff
mov ah,9
int 21h;輸出成績
mov ax,0
mov si,offset buff
clc
adc0:adc ax,word ptr [si]
inc si
loop adc0
mov bl,30
div bl
mov ah,0
div al,10;下面是實現10進制顯示
mov dh,ah
mov dx,offset word1
mov ah,09h
int 21h
mov dl,al
mov ah,02h
int 21h
mov dl,dh
mov ah,02h
int 21h
mov ah,4ch
int 21h
code ends
end start
E. 利用匯編語言統計學生成績,按優秀、良好、中等、及格、不及格加以區分
設內存中有一個位元組數組SCORE,存有10個學生的考試成績,編寫多分支程序,統計大於(含等於,以下同)90分,大於80分,大於70分,大於60分,小於60分的人數,結果分別置於A、B、C、D、E位元組單元。
.model small
.486
.stack
.data
score 70,86,90,45,60,96,100,65,72,87
count equ 10 ;總人數
score_E db ? ;0--59分人數
score_D db ? ;60--69分人數
score_C db ? ;70--79分人數
score_B db ? ;80--89分人數
score_A db ? ;90--99分人數
.code
.startup
lea bx, score
mov cx, count
again: mov al,[bx] ;取一個成績
call tjrs ;調用統計分段人數
inc bx ;調整指針
loop again ;cx-cx-1,cx=0退出循環
.exit 0
tjrs proc ;統計分段人數
cmp al, 60
jae next0 ;al>= 60轉
inc score_E ;al<60,0--59分的人數加1
jmp next4
next0: cmp al, 70
jae next1
inc score_D
jmp next4
next1: cmp al, 80
jae next2
inc score_C
jmp next4
next2: cmp al, 90
jae next3
inc score_B
jmp next4
next3: inc score_A
next4: ret
tjrs endp
end
F. 求匯編語言學生成績管理
雖然不太懂,但按我的理解給你吧:
(真實姓名就不打了)
1 秋:1 地理:98、語文:專72、英語:95
2 地理:94、語文:68.5、英語:97
心:1 地理:68、語文:77 、英語:84
2 地理:73、語文:66 、英語:88
……兩個為代表
2 部分成績下降原因,睡眠不足,上課沒精神、精力不集中,做作業速度慢。
3 ?
4 (1)秋屬 (2)心
5 秋:265(平均:88)、259.5(平均:86)
心:229(平均:79)、226(平均:75)
6 秋:地理:96 語文:72。25 英語:96
心:地理:70。5 語文:71。5 英語:86
7 班上:55人
>=90:5 80~89:18 70~79:21 60~69 3 <=59:8
8 退出(?)
在電腦邊打了40多分鍾啊,體諒一下吧!
G. 用匯編語言實現學生成績統計分析
DATA SEGMENT
STRING1 DB 'Please Input Score:','$' ;提示輸入
STRING2 DB 'The Order From MAX To MIN:','$'
;輸出排序從大到小
SCORE DW 60 DUP(0) ;分配存放空間
S5 DW 0 ;定義變數
S6 DW 0
S7 DW 0
S8 DW 0
S9 DW 0
S10 DW 0
DATA ENDS
STACK SEGMENT ;堆棧段
DW 64 DUP(0)
STACK ENDS
CODE SEGMENT ;代碼段
ASSUME CS:CODE,DS:DATA,SS:STACK
START:
MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SS,AX
MOV DX,OFFSET STRING1 ;顯示提示輸入
MOV AH,09H
INT 21H
XOR BX,BX ;寄存器清零
XOR CX,CX
XOR SI,SI
XOR DI,DI
INPUT: MOV AH,1 ;輸入一個字元
INT 21H
CMP AL,0DH ;是否為回車鍵
JZ OVER ;是就跳到OVER
CMP AL,20H ;是否為空格
JZ SAVE ;是就跳到SAVE
SUB AL,30H ;變為真數
MOV CL,4
SHL BX,CL ;左移四位,變為BCD碼
ADD BL,AL
JMP INPUT
SAVE: MOV SCORE[SI],BX ;保存到SCORE中
ADD SI,2
INC DI
XOR BX,BX
JMP INPUT
OVER: MOV SCORE[SI],BX ;保存最後一個數據,並存放到SCORE中
INC DI
MOV DL,0AH
MOV AH,02H
INT 21H
MOV CX,DI
DEC CX
XOR BX,BX
COMP1: MOV SI,2 ;指向下一個數
MOV DX,CX
COMP2: MOV AX,SCORE[BX]
CMP AX,SCORE[BX+SI] ;比較前後兩個數
JNC COMP3 ;小於就跳到COMP3
XCHG AX,SCORE[BX+SI] ;交換位置
MOV SCORE[BX],AX
COMP3: ADD SI,2 ;指向下一個數
DEC DX
JNZ COMP2
ADD BX,2 ;指向下一個數
LOOP COMP1
MOV DX,OFFSET STRING2
MOV AH,09H
INT 21H
SUB SI,SI ;把SI清零
OUT_PUT1:
MOV BX,SCORE[SI] ;輸出百位數
MOV DL,BH
AND DL,0FH
ADD DL,30H
MOV AH,02H
INT 21H
MOV DL,BL ;輸出十位數
MOV CL,4
SHR DL,CL
ADD DL,30H
MOV AH,02H
INT 21H
MOV DL,BL ;輸出個位數
AND DL,0FH
ADD DL,30H
MOV AH,02H
INT 21H
MOV DL,20H ;輸出空格
MOV AH,02H
INT 21H
ADD SI,2
DEC DI
OUT_PUT2:MOV BX,SCORE[SI] ;輸出十位數
MOV DL,BL
MOV CL,4
SHR DL,CL
ADD DL,30H
MOV AH,02H
INT 21H
MOV DL,BL ;輸出個位數
AND DL,0FH
ADD DL,30H
MOV AH,02H
INT 21H
MOV DL,20H ;輸出空格
MOV AH,02H
INT 21H
ADD SI,2
DEC DI
JNZ OUT_PUT2
MOV CX,10 ;設置計數器為10
MOV BX,OFFSET SCORE
COMPARE: MOV AX,[BX]
CMP AX,60 ;與60比較
JL FIVE ;小於就跳到FIVE
CMP AX,70 ;與70比較
JL SIX ;小於就跳到SIX
CMP AX,80 ;與80比較
JL SEVEN ;小於就跳到SEVEN
CMP AX,90 ;與90比較
JL EIGHT ;小於就跳到EIGHT
CMP AX,100 ;與100比較
JNE NINE ;不為0就是90到99
INC S10 ;100時【S10+1】
JMP NEWDATA ;跳到NEWDATA
FIVE: INC S5 ;小於60時【S5+1】
JMP NEWDATA ;跳到NEWDATA
SIX: INC S6 ;大於等於60小於70時【S6+1】
JMP NEWDATA ;跳到NEWDATA
SEVEN: INC S7 ;大於等於70小於80時【S7+1】
JMP NEWDATA ;跳到NEWDATA
EIGHT: INC S8 ;大於等於80小於90時【S8+1】
JMP NEWDATA ;跳到NEWDATA
NINE: INC S9 ;大於等於90小於100時【S9+1】
NEWDATA: ADD BX,2 ;取下個數
LOOP COMPARE ;循環COMPARE
MOV AH,4CH ;返回DOS
INT 21H
CODE ENDS
END START
H. 匯編語言統計學生各分數段人數
;以下和你要求的差不多,改改就可以用,有什麼不懂得可以問我
data segment
credit dw 76,69,84,90,73,88,99,63,100,80
mes1 db '60-69:$'
mes2 db '70-79:$'
mes3 db '80-89:$'
mes4 db '90-99:$'
mes5 db '100:$'
v1 db ? ;60-69段人數計數器
v2 db ? ;70-79段人數計數器
v3 db ? ;80-89段人數計數器
v4 db ? ;90-99段人數計數器
v5 db ? ;100段人數計數器
data ends
code segment
assume cs:code,ds:data
main proc far
start:
mov ax,data
mov ds,ax
call count ;統計各分段人數的子程序
mov ah,4ch
int 21h
ret
main endp
count proc near
lea si,credit
mov cx,0ah
m1:mov bx,[si]
add si,2
cmp bx,60
jl m6
cmp bx,69
jg m2
inc v1
jmp m6 ;60-69
m2:cmp bx,79
jg m3 ;70-79
inc v2
jmp m6
m3:cmp bx,89
jg m4 ;80-89
inc v3
jmp m6
m4:cmp bx,99
jg m5 ;90-99
inc v4
jmp m6
m5:cmp bx,100
jg m6 ;100
inc v5
m6:loop m1
mov dx,offset mes1
mov ah,09h
int 21h
mov dl,v1
add dl,30h
mov ah,02h
int 21h
call crlf
mov dx,offset mes2
mov ah,09h
int 21h
mov dl,v2
add dl,30h
mov ah,02h
int 21h
call crlf
mov dx,offset mes3
mov ah,09h
int 21h
mov dl,v3
add dl,30h
mov ah,02h
int 21h
call crlf
mov dx,offset mes4
mov ah,09h
int 21h
mov dl,v4
add dl,30h
mov ah,02h
int 21h
call crlf
mov dx,offset mes5
mov ah,09h
int 21h
mov dl,v5
add dl,30h
mov ah,02h
int 21h
exit:
ret
count endp
crlf proc near ;回車換行子程序
mov dl,0ah
mov ah,02h
int 21h
mov dl,0dh
mov ah,02h
int 21h
ret
crlf endp
code ends
end start
I. 【高分】幫忙用匯編語言做一個程序:學生成績統計
; 程序操作說明:
; 1、本程序定義:姓名最多個20個字元,學號最多10個字元,成績最多3位數字
; 2、輸入學生信息時,各信息足位時,自動結束;不足位數時,按回車鍵結束
; 3、輸入姓名時,若直接回車,表示結束學生信息輸入,進入信息處理
; 本程序在MASMPlus 1.2集成環境下通過編譯,經過調試,運行正確。
Code Segment
Assume CS:Code,DS:Code
; -------------------------------------
; 功能:顯示指定地址(Str_Addr)的字元串
; 入口:
; Str_Addr=字元串地址(要求在數據段)
; 用法: Output Str_Addr
; 用法舉例:Output PromptStr
Output MACRO Str_Addr
lea dx,Str_Addr
mov ah,9
int 21h
EndM
; -------------------------------------
; 功能:輸出一個字元
; 入口:dl=要顯示的字元
Output_Chr proc Near
push ax
mov ah,02h
int 21h
pop ax
ret
Output_Chr endp
; -------------------------------------
; 功能:輸出回車換行
Output_CTLF proc Near
push ax
push dx
mov ah,02h
mov dl,0dh
int 21h
mov dl,0ah
int 21h
pop dx
pop ax
ret
Output_CTLF endp
; -------------------------------------
; 功能:取游標位置
; 入口:無
; 出口:DH=行號,DL=列號
GetCursor Proc Near
PUSH AX
PUSH BX
PUSH CX
XOR BX,BX
MOV AH,3
INT 10H
MOV Cursor_Row,DH
MOV Cursor_Col,DL
POP CX
POP BX
POP AX
RET
Cursor_Row DB ?
Cursor_Col DB ?
GetCursor EndP
; -------------------------------------
; 功能:置游標位置
; 入口:Cursor_Row=行坐標; Cursor_Col: 列坐標)
SetCursor Proc Near
PUSH CX
PUSH BX
PUSH AX
MOV DH,Cursor_Row
MOV DL,Cursor_Col
XOR BX,BX
MOV AH,2
INT 10H
POP AX
POP BX
POP CX
RET
SetCursor EndP
; -------------------------------------
; 功能:鍵盤輸入一個指定位數的十進制數字,將其轉換成二進制數並保存在指定的內存單元。
; 由於限定最大數據類型為字,所以,數字位數最多:5,最大無符號數:65536
; 約定:直接回車,視為數字0
; 入口:@@Digits=數字位數;di=保存輸入的數字首地址
; @@Type_Data=保存的數據類型,B=位元組類型,W=字類型。
; 出口:轉換後的二進制數保存在di所指的單元
Input_Digit Proc Near
CR equ 000DH
LF equ 000AH
KBBack equ 0008H
push dx
push cx
push bx
push di
lea di,@@Save_Tmp
push di
cld
mov cl,@@Digits
xor ch,ch
push cx
@@Input: call GetCursor ;取游標位置
mov ah,1 ;從鍵盤接受一個字元
int 21h
cmp al,CR ;若鍵入的是回車,已經鍵入的數字不足N位
jz @@ASC_Dec ;轉去處理已經鍵入的數字
cmp al,KBBack
jz @@KB_Back ;若是回空鍵,重新輸入
cmp al,'0'
jb @@KBBack ;若低於數字'0',重新輸入
cmp al,'9'
ja @@KBBack ;若低於數字'9',重新輸入
jmp @@Save_Dig
@@KB_Back: dec Cursor_Col
inc cx
dec di
@@KBBack: call SetCursor ;置游標位置
jmp @@Input
@@Save_Dig: and al,0fh ;轉換成二進制數
stosb ;保存
loop @@Input ;接受下一個數字
@@ASC_Dec: mov ax,cx
pop cx
pop si
sub cx,ax ;實際輸入的數字位數
xor bp,bp
xor dx,dx
xor ax,ax
jcxz @@Save_Ret ;若直接回車,沒有輸入任何數字,按輸入'0'處理
dec cx ;實際輸入的數字位數減1,准備把輸入的這一串數字轉換成二進制數
jcxz @@One_Digit ;若輸入的數字只有一位,轉去直接保存這個二進制數
mov bx,10
@@Mul_Ten: lodsb
cbw
add ax,bp
mul bx
mov bp,ax
loop @@Mul_Ten
@@One_Digit: lodsb
cbw
add ax,bp
@@Save_Ret: pop di
cmp @@Type_Data,'B' ;位元組類型?
jz $+5
stosw
jmp $+3
stosb
pop bx
pop cx
pop dx
ret
@@Digits db ? ;十進制數字位數
@@Type_Data db 'B' ;保存的數據類型。B=位元組類型,W=字類型
@@Save_Tmp db 16 p(?)
Input_Digit EndP
; -------------------------------------
; 功能:把AX中的二進制無符號數轉換成顯式的十進制ASCII碼,並送顯示屏顯示
; 入口:AX=二進制數
; 出口:在當前游標位置顯示轉換後的ASCII碼數字
Dec_ASCII Proc Near
push dx
push bx
push di
mov bx,10
lea di,@@Temp_Save[6]
mov BYTE ptr [di],'$'
dec di
@@Divide: xor dx,dx
div bx
or dl,30h
mov [di],dl
dec di
test ax,0ffffh
jnz @@Divide
inc di
push di
pop dx
mov ah,9
int 21h
pop di
pop bx
pop dx
ret
@@Temp_Save db 7 p(?)
Dec_ASCII EndP
; -------------------------------------
; 功能:把AL中的二進制無符號數作為小數轉換成顯式的十進制ASCII碼,
; 並送顯示屏顯示,未考慮四捨五入
; 入口:AH=二進制數,BH=除數,CX=保留小數位數
; 出口:在當前游標位置顯示轉換後的ASCII碼數字
Dec_Frac Proc Near
push ax
mov dl,'.'
call Output_Chr ;顯示一個小數點
pop ax
mov bl,10 ;乘數
@@Dec_Frac: mov al,ah ;余數不為0,處理小數部分
mul bl ;余數乘10,繼續做除法
div bh ;除以除數,取商數作為結果的一位小數
or al,30h
mov dl,al
call Output_Chr ;顯示一位小數
loop @@Dec_Frac
ret
Dec_Frac EndP
; -------------------------------------
Name_Length equ 20 ;姓名長度
ID_Length equ 10 ;學號長度
Info_Students Struc ; 學生信息結構類型
Name_Student db Name_Length p(?) ;姓名
ID_Student db ID_Length p(?) ;學號
Score_Student db ? ;成績
Info_Students EndS
; -------------------------------------
Prompt_Str db 7,'Name',Name_Length-4+2 p(20h) ;姓名標題字元串
db 'Student ID',2 p(20h) ;學號標題字元串
db 'Score',CR,LF ;成績標題字元串
db Name_Length p('-'),2 p(20h)
db ID_Length p('-'),2 p(20h)
db 5 p('-'),CR,LF,'$'
Temp_Cursor dw ? ;輸入、顯示學生信息游標位置
prompt_Ave db CR,LF,'Average: $' ;提示顯示平均分
Buffer_Data db ?,?,Name_Length+2 p(?) ;姓名、學號輸入緩沖區
Press_Key db CR,LF,CR,LF,'Press any key to exit...$'
Start: push cs
pop ds
push cs
pop es ;使數據段、附加段與代碼段同段
mov @@Digits,3 ;十進制數字位數
mov @@Type_Data,'B' ;保存的數據類型。B=位元組類型,W=字類型
; -------------------------------------
; 顯示姓名、學號、成績標題,提示輸入學生信息
Output Prompt_Str
call GetCursor ;取游標位置
mov Temp_Cursor,dx ;保存輸入、顯示學生信息游標位置
; -------------------------------------
; 輸入學生姓名、學號、成績
lea di,Score_Table ;姓名、學號、成績存放地址
Input_Name: call GetCursor ;取游標位置
mov Buffer_Data,Name_Length+1 ;允許輸入的最多字元數
push di
lea di,Buffer_Data[2]
mov cx,(Name_Length+2)/2
mov ax,2020h ;填充空格
rep stosw
pop di
lea dx,Buffer_Data ;姓名輸入緩沖區地址
mov ah,0ah
int 21h
lea si,Buffer_Data[1]
lodsb ;讀入實際輸入的字元個數
test al,al
jz @@L1 ;若輸入學生姓名時,直接回車,認為學生姓名、學號、成績等輸入結束,轉去計算輸入的學生人數
mov cx,Name_Length ;姓名字元數
rep movsb ;寫入學生信息緩沖區
add Cursor_Col,Name_Length+2 ;列號加姓名長度再加2,開始輸入學號
call SetCursor ;置游標位置
push di
lea di,Buffer_Data[2]
mov cx,(Name_Length+2)/2
mov ax,2020h ;填充空格
rep stosw
pop di
lea dx,Buffer_Data ;學號輸入緩沖區地址
mov ah,0ah
int 21h
lea si,Buffer_Data[2]
mov cx,ID_Length ;學號字元數
rep movsb ;寫入學生信息緩沖區
add Cursor_Col,ID_Length+2 ;列號加學號長度再加2,開始輸入成績
call SetCursor ;置游標位置
call Input_Digit ;輸入成績
call Output_CTLF ;輸出一個回車、換行
jmp Input_Name ;輸入下一名學生信息
; -------------------------------------
; 計算輸入的學生人數
@@L1: mov ax,di
sub ax,offset Score_Table ;所有學生信息所佔內存容量
mov bl,type Info_Students ;每名學生信息所佔內存容量
div bl
mov cx,ax ;CX=輸入的學生人數
test cx,cx
jnz @@L00
jmp Exit_Proc ;若未輸入任何信息,直接結束程序
; -------------------------------------
; 建立學生信息鏈表
@@L00: push di ;保存鏈表地址
lea ax,Score_Table ;學生信息起始地址
push cx
@@L2: stosw ;保存學生信息地址
add ax,type Info_Students ;每名學生信息所佔內存容量
loop @@L2
pop cx
pop si ;彈出鏈表地址給si
cmp cx,2
jb Exit_Proc ;若只輸入了1名學生的信息,則無須排序和顯示結果
; -------------------------------------
; 用冒泡排序法按成績降序排序
push si ;入棧保存鏈表地址
push cx ;保存學生人數
dec cx ;准備用冒泡排序法排序
@@Sorting: push cx ;入棧保存外循環次數
push si ;入棧保存數組地址
@@Compare: push si
pop di ;當前數組元素地址賦給目的變址寄存器,以備交換之用
lodsw ;將當前學生信息地址讀入AX
mov bx,ax
mov al,[bx.Score_Student] ;將當前學生成績讀入AL
mov bx,[si] ;相鄰的下一個學生信息地址
cmp al,[bx.Score_Student] ;當前學生成績與相鄰的下一個學生成績相比較
jae @@NextOne ;若大於或等於,不作數據交換,處理下一個數組元素
mov ax,[di] ;若小於,讀入當前學生信息鏈表節點
xchg ax,[si] ;交換鏈表元素
mov [di],ax ;保存數值較大者節點地址
@@NextOne: loop @@Compare ;處理下一個數組元素
pop si ;數組地址出棧
pop cx ;外循環次數出棧
loop @@Sorting ;下一趟比較
call Output_CTLF
; -----------------------------------------
; 按成績降序顯示所有學生信息
Output Prompt_Str ;顯示學生信息標題
call GetCursor ;取游標位置
mov Temp_Cursor,dx ;保存顯示學生信息游標位置
pop cx ;彈出學生人數
pop si ;彈出鏈表地址
push cx ;保存學生人數
xor bx,bx ;總成績初值
@@List_Info: push cx ;保存學生人數
call GetCursor ;取游標位置
lodsw ;讀入鏈表的一個節點
push si ;入棧保存鏈表地址
mov si,ax
push si ;入棧保存學生信息地址
lea si,[si.Name_Student] ;姓名地址
mov cx,Name_Length ;姓名字元串長度
@@Dsip_Name: lodsb ;讀入一個字元
cmp al,0dh ;回車符?
jz @@L3 ;是,姓名顯示結束
mov dl,al
call Output_Chr ;顯示一個字元
loop @@Dsip_Name ;下一個字元
@@L3: add Cursor_Col,Name_Length+2 ;列號加姓名長度再加2,開始顯示學號
call SetCursor ;置游標位置
pop si ;彈出學生信息地址
push si ;入棧保存學生信息地址
lea si,[si.ID_Student] ;學號地址
mov cx,ID_Length ;姓名字元串長度
@@Dsip_ID: lodsb ;讀入一個字元
cmp al,0dh ;回車符?
jz @@L4 ;是,學號顯示結束
mov dl,al
call Output_Chr ;顯示一個字元
loop @@Dsip_ID ;下一個字元
@@L4: add Cursor_Col,ID_Length+2 ;列號加學號長度再加2,開始顯示成績
call SetCursor ;置游標位置
pop si ;彈出學生信息地址
lea si,[si.Score_Student] ;成績地址
lodsb ;讀入成績
xor ah,ah
add bx,ax ;累加總成績
call Dec_ASCII ;把AX中的二進制無符號數轉換成顯式的十進制ASCII碼,並送顯示屏顯示
call Output_CTLF
pop si ;彈出鏈表地址
pop cx ;彈出學生人數
loop @@List_Info ;下一個節點(學生信息)
call Output_CTLF
; -------------------------------------
; 計算並顯示平均分
Output prompt_Ave ;提示顯示平均分
mov ax,bx
pop bx ;彈出學生人數
div bl ;平均分取整數部分
mov bh,ah ;保存余數
xor ah,ah
call Dec_ASCII ;顯示平均分
mov ah,bh ;余數
mov bh,bl ;除數
mov cx,2 ;保留小數位數
call Dec_Frac ;把AL中的二進制無符號數作為小數轉換成顯式的十進制ASCII碼
; -------------------------------------
Exit_Proc: Output Press_Key ;提示操作完成,按任意鍵結束程序
mov ah,1
int 21h
mov ah,4ch ;結束程序
int 21h
Score_Table: ;學生成績存儲區
Code ENDS
END Start ;編譯到此結束
J. 用匯編語言學生成績管理
參照一下這個程序吧,我也不會 這是一個學生成績管理系統,其中「I」表示插入,「L」表示瀏覽,「Q」表示查詢, 「E」表示退出,「D」表示刪除,「M」表示修改,"c"表示統計各分數段人數,"p"表示列印. 本程序實現了: (1)單獨運行以上各功能,即在進入主菜單以後,點一功能鍵後關閉,再進入主菜單 點別的功能鍵。如運行"cjgl"文件後,在出現的主界面中點「I」,可插入數據,插入完 以後,關閉;在出現的主界面中點「M」,可修改數據,修改完以後關閉,用同樣的方法 可運行其它的功能。 (2)連續運行部分的功能。 應將文件"score.txt"放在相應的路徑下.如在本程序中,需將該文件放在"c:\masm\score.txt"下. 注:該文件的路徑可從匯編源文件的"fname db "c:\masm\score.txt"""中查找. data segment mess1 db ' student grade management system',0ah,0dh,'$' mess2 db ' this is main menu',0ah,0dh,'$' mess3 db ' insert (i) please input:',0ah,0dh,'$' mess4 db ' modify (m) name :',0ah,0dh,'$' mess5 db ' delete (d) maths :',0ah,0dh,'$' mess6 db ' query (q) english :',0ah,0dh,'$' mess7 db ' count (c) computer:',0ah,0dh,'$' mess8 db ' print (p) chinese :',0ah,0dh,'$' mess9 db ' exit (e)',0ah,0dh,'$' mess10 db '**********************************************************$' mess11 db 'name Ma En Co Ch',0ah,0dh,'$' mess13 db ' list (l)',0ah,0dh,'$' mess12 db 'maths <60 <70 <80 <90 <100',0ah,0dh,'$' err1 db ' there is not this student$' err2 db ' file close wrong$' fname db "e:\hbyy\score.txt" buffer1 db 23 p(?) buffeer db 0ah,0dh,'$' buffer2 db 30 p(?) buffer3 db 8 p('0') count db 5 handle dw ? del db 8 p('0') x db ? data ends score struc names db 15 p(' ') maths db 0,0 english db 0,0 computer db 0,0 chinese db 0,0 score ends show macro addrs lea dx,addrs mov ah,9 int 21h endm set_p1 macro a mov ah,2 mov dh,a mov dl,36 mov bh,0 int 10h endm set_p2 macro mov ah,2 mov dh,12 mov dl,2 mov bh,0 int 10h endm set_p3 macro mov ah,2 mov dh,1 mov dl,30 mov bh,0 int 10h endm clear macro ;all screen mov al,0 mov cl,0 mov ch,0 mov dh,24 mov dl,79 mov bh,7 mov ah,6 int 21h endm clear1 macro ;lefe screen mov al,0 mov bh,7 mov ch,4 mov cl,36 mov dh,10 mov dl,79 mov ah,6 int 10h endm clear2 macro ;down screen mov al,0 mov bh,7 mov ch,12 mov cl,0 mov dh,24 mov dl,79 int 10h endm newline macro push ax push dx mov dl,0dh mov ah,2 int 21h mov dl,0ah mov ah,2 int 21h pop dx pop ax endm show_item macro addrs local iloop,w10 push bx push cx mov bx,0 iloop: mov dl,addrs[bx] ;display char mov ah,2 int 21h inc bx cmp bx,15 jl iloop mov cx,4 w10: mov dl,' ' mov ah,2 int 21h mov dl,' ' mov ah,2 int 21h mov dl,' ' mov ah,2 int 21h mov dl,addrs[bx] mov ah,2 int 21h inc bx mov dl,addrs[bx] mov ah,2 int 21h inc bx loop w10 newline pop cx pop bx endm getin macro addrs,count2 local zeroit,lp,input_end,exit push bx push ax mov bx,0 zeroit: mov addrs[bx],' ' inc bx cmp bx,15 jl zeroit mov bx,0 lp: mov ah,1 int 21h cmp al,0ah jz input_end cmp al,0dh jz input_end mov addrs[bx],al inc bx cmp bx,count2 jl lp input_end: cmp al,0dh jz exit cmp al,0ah jz exit mov ah,7 int 21h jmp input_end exit: pop ax pop bx endm code segment main proc far assume cs:code,ds:data,es:data start: mov ax,data mov ds,ax mov ah,0 mov al,3 int 10h clear show mess1 show mess2 show mess13 show mess3 show mess4 show mess5 show mess6 show mess7 show mess8 show mess9 newline show mess10 set_p3 w: mov ah,7 int 21h cmp al,'i' jnz n1 call insert jmp w n1: cmp al,'m' jnz n2 call modify jmp w n2: cmp al,'d' jnz n3 call delete jmp w n3: cmp al,'q' jnz n4 call query jmp w n4: cmp al,'c' jnz n5 call cot jmp w n5: cmp al,'p' jnz n6 call print jmp w n6: cmp al,'l' jnz n7 call list jmp w n7: cmp al,'e' jz exitf jmp w exitf: mov ah,4ch int 21h ret main endp insert proc near push ax push bx push cx push dx mov dx,offset fname mov al,2 mov ah,3dh int 21h mov bx,ax clear1 set_p1 4 call get_rec mov cx,0 ;move file pointer to end mov dx,0 mov al,2 mov ah,42h int 21h mov cx,23 ;write file mov dx,offset buffer1 mov ah,40h int 21h mov ah,3eh int 21h set_p3 pop dx pop cx pop bx pop ax ret insert endp get_rec proc near push ax push bx getin buffer2,15 mov bx,0 mov cx,15 continue: mov al,buffer2[bx] mov buffer1[bx],al inc bx loop continue set_p1 5 getin buffer2,2 mov al,buffer2 mov buffer1[bx],al inc bx mov al,buffer2+1 mov buffer1[bx],al inc bx set_p1 6 getin buffer2,2 mov al,buffer2 mov buffer1[bx],al inc bx mov al,buffer2+1 mov buffer1[bx],al inc bx set_p1 7 getin buffer2,2 mov al,buffer2 mov buffer1[bx],al inc bx mov al,buffer2+1 mov buffer1[bx],al inc bx set_p1 8 getin buffer2,2 mov al,buffer2 mov buffer1[bx],al inc bx mov al,buffer2+1 mov buffer1[bx],al inc bx pop bx pop ax ret get_rec endp openf proc near mov dx,offset fname mov al,02 mov ah,3dh int 21h mov handle,ax ret openf endp query proc near push ax push bx push cx push dx clear1 clear2 mov dx,offset fname mov al,2 mov ah,3dh int 21h mov bx,ax set_p2 getin buffer1,15 lea dx,mess11 mov ah,9 int 21h b: mov ah,3fh mov cx,23 mov dx,offset buffer2 int 21h lea si,buffer2 lea di,buffer1 mov cx,15 c: mov al,byte ptr[si] cmp al,byte ptr[di] jnz b inc si inc di loop c mov [buffer2+23],'$' show_item buffer2 mov ah,3eh int 21h pop dx pop cx pop bx pop ax ret query endp modify proc near push ax push bx push cx push dx clear1 set_p1 4 mov dx,offset fname mov al,2 mov ah,3dh int 21h mov bx,ax mov handle,ax call get_rec ; contact is in buffer1 read: mov dx,offset buffer2 mov cx,23 mov ah,3fh int 21h lea si,buffer2 lea di,buffer1 mov cx,15 c5: mov dl,byte ptr[si] cmp dl,byte ptr[di] jnz read inc si inc di loop c5 mov bx,handle mov ah,42h mov al,1 mov cx,0ffffh mov dx,-23 int 21h mov cx,23 mov dx,offset buffer1 mov ah,40h int 21h mov ah,3eh int 21h jmp exit2 exit1: set_p2 show err1 exit2: set_p3 pop dx pop cx pop bx pop ax ret modify endp delete proc near push ax push bx push cx push dx clear1 set_p1 4 mov dx,offset fname mov al,2 mov ah,3dh int 21h mov bx,ax mov handle,ax getin buffer1,15 ; contact is in buffer1 read5: mov dx,offset buffer2 mov cx,23 mov ah,3fh int 21h lea si,buffer2 lea di,buffer1 mov cx,15 c6: mov dl,byte ptr[si] cmp dl,byte ptr[di] jnz read5 inc si inc di loop c6 mov bx,handle mov ah,42h mov al,1 mov cx,0ffffh mov dx,-8 int 21h mov cx,8 mov dx,offset del mov ah,40h int 21h mov ah,3eh int 21h jmp exit6 exit5: set_p2 show err1 exit6: set_p3 pop dx pop cx pop bx pop ax ret delete endp list proc near push ax push bx push cx push dx clear1 clear2 set_p2 show mess11 mov dx,offset fname mov al,2 mov ah,3dh int 21h mov bx,ax again: mov dx,offset buffer1 mov cx,23 mov ah,3fh int 21h cmp ax,0 jz p show_item buffer1 jmp again p: mov ah,3eh int 21h set_p3 pop dx pop cx pop bx pop ax ret list endp print proc near push ax call openf mov cl,count mov ch,0 read2: mov dx,offset buffer1 mov cx,type score mov ah,3fh int 21h mov cx,23h mov bx,0 next: mov ah,5 mov dl,byte ptr buffer1[bx] int 21h inc bx loop next mov ah,5 mov dl,0dh int 21h dec x cmp x,0 jnz read2 mov bx,handle mov ah,3eh int 21h pop ax ret print endp cot proc push ax clear2 set_p2 show mess12 mov dx,offset fname mov ah,3dh int 21h mov bx,ax mov handle,ax read0: mov dx,offset buffer2 mov cx,23 mov ah,3fh int 21h mov dl,[buffer2+15] cmp dl,'6' jl five cmp dl,'7' jl six cmp dl,'8' jl seven cmp dl,'9' jl eight inc [buffer3+4] jmp quit eight: inc [buffer3+3] jmp quit seven: inc [buffer3+2] jmp quit six: inc [buffer3+1] jmp quit five: inc [buffer3] quit: cmp ax,0 jnz read0 mov cx,10 a: mov dl,' ' mov ah,2 int 21h loop a mov bx,0 a0: mov dl,[buffer3+bx] mov ah,2 int 21h inc bx mov dl,' ' mov ah,2 int 21h mov dl,' ' mov ah,2 int 21h cmp bx,5 jnz a0 mov bx,handle mov ah,3eh int 21h set_p3 pop ax ret cot endp code ends end start