匯編完成輸入10個學生成績嗎
1. 8086匯編語言 在此輸入10個學生的成績後,依次在界面上顯示:及格人數x個,不及格y個
這要看你用的系復統了,
XP的話,可以制用最原始的Masm和Tasm,這是以前DOS環境下用的,最直接,用DEBUG可以操作內存,很強大。
由於好些DOS下的東西在WIN7下支持不好,所以如果你的系統是WIN7的話建議用emu8086,它在系統下模擬的環境也很不錯,界面也比較好
2. 用匯編語言,在鍵盤里輸入10個學生的成績,用冒泡排序法從大到小進行排
CODESEGMENT
ASSUMECS:CODE
ORG100H
START:
PUSHCS
POPDS
PUSHCS
POPES
CALLINPUTNUM
MOVAX,NUM
MOVN,AX
CALLBUBBLESORT
MOVAH,2
MOVDL,10
INT21H
MOVDL,13
INT21H
MOVCX,N
LEASI,ARRAY
@M1:
MOVAX,[SI]
CALLDISPAX
INCSI
INCSI
LOOP@M1
MOVAH,4CH
INT21H
NDW?
;============================================
BUBBLESORTPROCNEAR
LEABX,ARRAY
LEASI,NUM
MOVAX,SI
SUBAX,BX
RORAX,1
MOVWORDPTR[NUM],AX
DECWORDPTR[NUM]
MOVWORDPTR[I],0;以下採用冒泡排序
LEADI,ARRAY
LINE1:
INCWORDPTR[I]
MOVAX,WORDPTR[I]
CMPAX,WORDPTR[NUM]
JGLINE3
MOVWORDPTR[J],0
LINE2:
INCWORDPTR[J]
MOVAX,WORDPTR[NUM]
INCAX
SUBAX,WORDPTR[I]
CMPWORDPTR[J],AX
JGLINE1
MOVBX,WORDPTR[J]
ROLBX,1
MOVAX,WORDPTR[DI][BX-2]
CMPAX,WORDPTR[DI][BX]
JNCLINE2
MOVCX,WORDPTR[DI][BX]
MOVWORDPTR[DI][BX],AX
MOVWORDPTR[DI][BX-2],CX
JMPLINE2
LINE3:
RET
IDW?
JDW?
BUBBLESORTENDP
;===============================================
;鍵盤輸入數值數組子程序(數組名為array,元素個數存放在num中)
INPUTNUMPROCNEAR
;輸入的數據以一個空格分隔,以回車符結束輸入
LEADI,ARRAY;將數組第一個元素的有效地址置入DI
MOVWORDPTR[NUM],0
STIN:
MOVAX,0
PUSHAX
AGAIN1:
MOVAH,1
INT21H
MOVBYTEPTR[CHAR],AL
CMPAL,13
JELINE0
CMPAL,''
JELINE0
SUBAL,30H
MOVAH,0
MOVSI,AX
POPAX
MOVCL,10
MOVCH,0
MULCX
ADDAX,SI
PUSHAX
JMPAGAIN1
LINE0:
POPAX
MOVWORDPTR[DI],AX
INCWORDPTR[NUM]
CMPBYTEPTR[CHAR],13
JESTINEND
INCDI
INCDI
JMPSTIN
STINEND:
RET
ARRAYDW100DUP(0)
NUMDW0
CHARDB?
INPUTNUMENDP
;===============================================
DISPAXPROCNEAR
PUSHBX
PUSHCX
PUSHDX
PUSHSI
PUSHDS
PUSHCS
POPDS
PUSHAX
MOVAH,2
MOVDL,32
INT21H
POPAX
MOVBYTEPTRNZ,0
PUSHAX
LEASI,DIVARR
MOVCX,5
@1:
POPAX
MOVDX,0
MOVBX,[SI]
DIVBX
PUSHDX
CMPAL,0
JNE@2
CMPBYTEPTRNZ,1
JE@2
CMPCX,1
JE@2
MOVDL,20H
JMP@3
@2:
ADDAL,30H
MOVDL,AL
MOVBYTEPTRNZ,1
@3:
MOVAH,2
INT21H
INCSI
INCSI
LOOP@1
POPDX
POPDS
POPSI
POPDX
POPCX
POPBX
RET
DIVARRDW10000,1000,100,10,1
NZDB0
DISPAXENDP
;=============================================
CODEENDS
ENDSTART
3. 求用匯編語言實現:從鍵盤輸入10個學生成績,求最高,最低和平均值。
data段略,ax存放現在第一個學生內的位置容
mov bl, [ax}
a2: inc ax
cmp [ax],bl
jg a1
bh = bl
a1: dec cl,1
cmp cl,0
jne a2
4. 【高分】幫忙用匯編語言做一個程序:學生成績統計
; 程序操作說明:
; 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 ;編譯到此結束
5. 用匯編語言用匯編語言編寫從鍵盤上輸入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
6. 求解答,匯編語言如何設計10個學生成績統計
; 本程序在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
; -------------------------------------
; 功能:把AX中的二進制無符號數轉換成顯式的十進制ASCII碼,並送顯示屏顯示
; 入口:AX=二進制數
; 出口:在當前游標位置顯示轉換後的ASCII碼數字
Dec_ASCII Proc Near
push ds
push cs
pop ds
push cs
pop es
push dx
push bx
push di
mov bx,10
lea di,@@Temp_Save[6]
mov BYTE ptr [di],'$'
dec di
cld
@@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
pop ds
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
; -------------------------------------
SCORE db 56,69,84,82,73,88,99,63,100,80 ; 成績單
Elements equ ($-SCORE)/Type SCORE ;元素個數
RESULT db 6 p(0) ; 各分數段計數
SUM dw 0 ;總分
AVER db ? ;平均分
prompt_Res db '00---59: $'
prompt_Ave db 13,10,'Average: $' ;提示顯示平均分
Press_Key db 13,10,13,10,'The complated. Press any key to exit...$'
Start: push cs
pop ds
push cs
pop es ;使數據段、附加段與代碼段同段
; -------------------------------------
; 統計低於60分、60-69、70-79、80-89、90-100各分數段人數並顯示
lea si,SCORE ; 成績首地址
mov cx,Elements ;成績數目
mov dl,10 ; 用於除10
cld
@@Statics: lodsb ; 提取成績
xor ah,ah
add SUM,ax ;累計總分
div dl ; 除10
cmp al,5 ; >5,及格
jg $+4
mov al,5 ; <=5,不及格
sub al,5 ; 減5,分數段計數地址偏移量
cbw ;
push ax
pop bx
inc RESULT[bx] ; 計數增1
loop @@Statics ; 循環,統計下一個成績
mov al,RESULT[5] ;取100分人數
add RESULT[4],al ;加到90-100分數段
mov bl,59h
mov cx,5
lea si,RESULT ;各分數段計數數組首地址
lea dx,prompt_Res ; 統計結果字元串地址
List_Res: mov ah,9 ;顯示分數段提示信息
int 21h
lodsb ;讀入計數值
xor ah,ah
call Dec_ASCII ; 顯示統計結果
call Output_CTLF ;輸出一個回車、換行
mov al,bl
inc al
daa
mov bl,al
push cx
mov cl,4
xor ah,ah
shl ax,cl
shr al,cl
or ax,3030h
xchg ah,al
mov WORD ptr Prompt_Res,ax
mov al,bl
add al,9
mov bl,al
xor ah,ah
shl ax,cl
shr al,cl
or ax,3030h
xchg ah,al
mov WORD ptr Prompt_Res[5],ax
pop cx
loop List_Res
; -------------------------------------
; 計算並顯示平均分
Output prompt_Ave ;提示顯示平均分
mov bl,Elements
mov ax,SUM ;取總分
div bl ;平均分取整數部分
mov AVER,al ;保存平均分
xor ah,ah
call Dec_ASCII ;顯示平均分
Exit_Proc: lea dx,Press_Key ;提示操作完成,按任意鍵結束程序
mov ah,9
int 21h
mov ah,1
int 21h
mov ah,4ch ;結束程序
int 21h
Code ENDS
END Start ;編譯到此結束
7. 用匯編 記得用匯編 編制一程序,從鍵盤輸入的一個班學生的學號姓名成績,對成績排序
一次實驗,是不復可能編寫出制來這許多程序的。
實驗室的老師,會提供大部分(或全部)代碼。
學生做實驗時,現場操作,只需輸入下列:
輸入1是數據錄入並輸出(包括姓名、學號、成績);
輸入2是排序後的數據輸出(包括姓名、學號、成績、名次);
輸入3是可以按學號查找某學生,並輸出其成績,選擇修改或不改成績
而已。
8. 用匯編語言編寫 輸入十個學生某門課的成績,編程求出平均分、最高分和最低分,並顯示所求結果。
這個程序涉及幾個問題
1輸入
2輸出
3排序
4累計,求平均
你最好查書完成大部分,不明白的細節再來問
9. 求用匯編語言 解決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