学生成绩数组:46、68、88、87、76、89、99、65、100、80,汇编编程根据成绩数组cj中保存的10个学生的成绩,统计学生的成绩名次并填入名次数组mc中。并提供完整的汇编程序代码和注释,能够输出名次。
时间: 2023-07-04 20:25:33 浏览: 75
xscjgl.rar_xscjgl_学生成绩管理系统_汇编语言 成绩
好的,以下是根据您提供的题目要求编写的汇编程序代码和注释:
```
; 学生成绩数组
cj db 46, 68, 88, 87, 76, 89, 99, 65, 100, 80
; 名次数组,初始值为0
mc db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
; 数据段
data segment
; 在数据段中定义两个指针变量,用于保存数组的基地址
cj_ptr db ?
mc_ptr db ?
data ends
; 代码段
code segment
assume cs:code, ds:data
start:
; 初始化数组指针
mov ax, data
mov ds, ax
mov cx, 10
mov cj_ptr, offset cj
mov mc_ptr, offset mc
; 依次比较每个学生的成绩
mov bx, cx
dec bx
cmp_loop:
; 初始化内层循环的计数器
mov dx, bx
mov ax, dx
add ax, cx
mov bx, ax
; 比较 cj[dx] 和 cj[bx]
mov al, [cj_ptr+dx]
cmp al, [cj_ptr+bx]
jge not_greater
; 如果 cj[dx] < cj[bx],则将 mc[dx] 加 1
mov cl, [mc_ptr+dx]
inc cl
mov [mc_ptr+dx], cl
; 交换 cj[dx] 和 cj[bx]
xchg al, [cj_ptr+bx]
mov [cj_ptr+dx], al
jmp next_cmp
not_greater:
; 如果 cj[dx] >= cj[bx],则将 mc[bx] 加 1
mov cl, [mc_ptr+bx]
inc cl
mov [mc_ptr+bx], cl
next_cmp:
; 判断内层循环是否结束
dec dx
cmp dx, 0
jge cmp_loop
; 判断外层循环是否结束
dec cx
cmp cx, 0
jne cmp_loop
; 输出名次
mov ah, 9
mov cx, 10
mov si, offset mc
mov dl, '1'
mov bl, 10
print_loop:
mov al, dl
int 21h
mov al, ')'
int 21h
mov al, [si]
add al, 48
int 21h
mov al, bl
int 21h
inc dl
inc si
loop print_loop
; 程序结束
mov ah, 4ch
int 21h
code ends
end start
```
程序说明:
首先在数据段中定义了两个数组 `cj` 和 `mc`,分别保存了学生成绩和名次。然后定义了两个指针变量 `cj_ptr` 和 `mc_ptr`,用于保存数组的基地址。
在代码段中,首先初始化了数组指针和计数器,然后使用双重循环依次比较每个学生的成绩,并根据大小关系更新名次数组。最后使用 `int 21h` 中断输出名次,并结束程序。
需要注意的是,这里使用了 ASCII 码将数字转换为字符输出,因此需要加上字符 '0' 的 ASCII 码值 (48)。
另外,程序中的注释中使用了中文,实际上汇编语言的注释应该使用英文。
阅读全文