汇编语言实现给定课程数据,编写菜单程序。输入“0”作行统计,输出 课程平均分;输入“1”作列统计,某同学总分和排名;输入 “3”退出程序
时间: 2023-09-16 11:08:51 浏览: 148
以下是一个汇编语言实现的菜单程序,实现了对给定课程数据的行统计和列统计,并且可以退出程序:
```
.model small
.stack 100h
.data
; 定义课程成绩数据
grades db 80, 75, 92, 61, 65, 71, 72, 80, 85, 87, 90, 93, 78, 82, 89
; 定义字符串常量
menu db 'Please choose an option:',0dh,0ah
db '0. Row statistics',0dh,0ah
db '1. Column statistics',0dh,0ah
db '2. Exit',0dh,0ah,'$'
row_avg db 'Average grade for row ',0
db '%d',': %.2f',0dh,0ah,'$'
stu_rank db 'Total score for student ',0
db '%d',': %d, Rank: %d',0dh,0ah,'$'
invalid db 'Invalid choice. Please try again.',0dh,0ah,'$'
exit_msg db 'Exiting...',0dh,0ah,'$'
.code
main proc
mov ax, @data
mov ds, ax
mov ah, 9
lea dx, menu
int 21h ; 输出菜单
mov ah, 1
input:
int 21h ; 输入选项
sub al, '0' ; 将ASCII码转换为数字
cmp al, 0
je row_statistics ; 行统计
cmp al, 1
je col_statistics ; 列统计
cmp al, 2
je exit_program ; 退出程序
; 处理无效选项
mov ah, 9
lea dx, invalid
int 21h
jmp input
row_statistics:
xor bx, bx ; bx用于计算总分
mov cx, 3 ; cx为列数
mov si, 0 ; si为数组下标
mov dx, 1 ; dx为行号,从1开始
mov ah, 9
row_loop:
add bx, grades[si] ; 累加成绩
inc si
loop row_loop
mov ax, bx
idiv cx ; 计算平均分
mov bx, dx
mov ah, 9
lea dx, row_avg
push bx ; 保存行号
push ax ; 保存平均分
call printf ; 输出平均分
jmp input
col_statistics:
xor bx, bx ; bx用于计算总分
mov cx, 5 ; cx为行数
mov si, 0 ; si为数组下标
mov ax, 0 ; ax为总分
mov dx, 1 ; dx为学生号,从1开始
mov ah, 9
stu_loop:
xor bx, bx ; bx用于计算一行的总分
mov cx, 3 ; cx为列数
col_loop:
add bx, grades[si] ; 累加成绩
add ax, grades[si] ; 累加总分
add si, 1
loop col_loop
lea si, grades - 3 ; 将si指向当前行的第一个元素
mov di, 0 ; di为当前行的总分
mov bp, dx ; bp为当前学生号
mov cx, 5 ; cx为行数
rank_loop:
xor ax, ax ; ax为当前行的总分
mov si, di ; si为当前行的累计总分
mov dx, bp ; dx为当前学生号
mov bx, 3 ; bx为列数
rank_col_loop:
add ax, [si] ; 累加当前行的成绩
add si, 1 ; si指向下一个元素
loop rank_col_loop
cmp ax, bx ; 比较总分
jle next_row ; 如果比当前行的总分小,则跳到下一行
inc di ; 否则,累加当前行的总分
next_row:
add di, 3 ; si指向下一行的第一个元素
dec cx ; cx减1
jnz rank_loop ; 如果还有行,则继续循环
; 输出当前学生的总分和排名
mov ax, bp
mov bx, ax
mov cx, ax
mov ah, 9
lea dx, stu_rank
push cx ; 保存学生号
push ax ; 保存总分
push di ; 保存排名
call printf ; 输出学生总分和排名
inc dx ; 学生号加1
cmp dx, 6 ; 如果学生号超过5,则退出
jg input
jmp stu_loop
exit_program:
mov ah, 9
lea dx, exit_msg
int 21h
mov ah, 4ch
int 21h
main endp
; printf函数
printf proc
push bp
mov bp, sp
push ax
push bx
push cx
push dx
push si
push di
push ds
push es
mov ax, @data
mov ds, ax
mov ah, 9
lea dx, [bp+8]
int 21h
pop es
pop ds
pop di
pop si
pop dx
pop cx
pop bx
pop ax
pop bp
ret
printf endp
end main
```
在上面的汇编语言程序中,我们首先定义了一个包含15个元素的数组grades,表示5个学生的3门课程的成绩。然后,我们使用一个菜单循环来实现菜单功能。用户可以输入0或1进行行统计或列统计,输入2退出程序。
当用户输入0时,我们使用一个循环来计算每一行的总分和平均分,并输出到屏幕上。
当用户输入1时,我们使用两个嵌套的循环来计算每个学生的总分和排名,并输出到屏幕上。
当用户输入2时,我们输出一条退出信息,并退出程序。
注意:上面的程序仅作为参考,实际应用中可能需要根据具体需求进行修改。