汇编编程:根据成绩数组cj中保存的10个学生的成绩,统计相应学生的名次并填入名次数组mc中
时间: 2024-02-01 14:16:16 浏览: 79
下面是用汇编语言实现的代码:
```
.model small
.stack 100h
.data
cj db 70, 80, 90, 60, 75, 85, 95, 65, 77, 88
mc db 10 dup(0)
.code
main proc
mov ax, @data
mov ds, ax
mov cx, 10 ; 循环10次,对每个学生进行排名
lea si, cj ; 将数组cj的地址加载到si寄存器中
lea di, mc ; 将数组mc的地址加载到di寄存器中
mov bx, 1 ; 初始化名次为1
L1:
mov al, [si] ; 取出当前学生的成绩
mov ah, [di] ; 将当前学生的名次存入名次数组mc中
cmp al, [si+1] ; 比较当前学生的成绩和下一个学生的成绩
jge L2 ; 如果当前学生的成绩大于等于下一个学生的成绩,跳转到L2
inc bx ; 否则,名次加1
L2:
inc si ; 指向下一个学生的成绩
inc di ; 指向下一个学生的名次
dec cx ; 循环计数器减1
jnz L1 ; 如果还有学生,继续循环
mov ah, 4ch ; 退出程序
int 21h
main endp
end main
```
以上代码中,使用了两个指针si和di分别指向成绩数组cj和名次数组mc。使用了一个循环计数器cx,每次循环取出当前学生的成绩,并比较当前学生的成绩和下一个学生的成绩大小,根据大小关系更新名次。最后,将名次数组mc中的数据输出即可。
相关问题
汇编编程:根据成绩数组cj中保存的10个学生的成绩,统计相应学生的名次并填入名次数组mc中并输出mc数组
以下是使用x86汇编语言实现的代码:
```assembly
; 数据段
.data
cj db 80, 90, 70, 85, 95, 60, 75, 65, 100, 55 ; 存储10个学生的成绩
mc db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; 存储10个学生的名次,初始值为0
; 代码段
.code
main proc
mov ax, @data
mov ds, ax ; 初始化数据段寄存器
mov cx, 10 ; 循环10次,对每个学生进行处理
mov si, 0 ; si寄存器用于存储当前处理的学生的索引,初始值为0
loop_start:
mov al, cj[si] ; 加载当前学生的成绩
mov bh, 1 ; bh寄存器用于存储当前学生的名次,初始值为1
inner_loop_start:
cmp al, cj[bx] ; 将当前学生的成绩与其他学生的成绩逐一比较
jg inner_loop_end ; 如果当前学生成绩高于其他学生的成绩,则跳出循环
inc bh ; 否则将当前学生的名次加1
inc bx ; bx寄存器用于存储当前比较的学生的索引,加1后继续比较
jmp inner_loop_start
inner_loop_end:
mov mc[si], bh ; 将当前学生的名次存入名次数组
inc si ; 处理下一个学生
loop loop_start
; 输出名次数组
mov cx, 10 ; 循环10次,输出名次数组中的所有元素
mov si, 0 ; si寄存器用于存储当前输出的元素的索引,初始值为0
output_loop_start:
mov dl, mc[si] ; 加载当前要输出的名次
add dl, 48 ; 将数字转换为ASCII码
mov ah, 02h ; 使用dos中断21h中的02h功能,输出一个字符
int 21h
mov ah, 02h ; 使用dos中断21h中的02h功能,输出一个空格
mov dl, ' '
int 21h
inc si ; 处理下一个元素
loop output_loop_start
mov ah, 4Ch ; 使用dos中断21h中的4Ch功能,退出程序
int 21h
main endp
end main
```
该代码实现了对成绩数组中每个学生的成绩进行遍历,并针对每个学生计算出其名次,并将名次存入名次数组中。最后,输出名次数组中的所有元素。
需要注意的是,在比较当前学生的成绩和其他学生的成绩时,使用了bx寄存器存储当前比较的学生的索引。由于bh寄存器已经被用于存储当前学生的名次,因此在比较学生成绩时需要使用bx寄存器的低8位存储学生的索引。
汇编编程:根据成绩数组cj中保存的10个学生的成绩,统计相应学生的名次并填入名次数组mc中 (提示:一个学生的名次等于成绩高于该学生的人数加1)。
以下是一份汇编程序,根据输入的成绩数组,统计每个学生的名次并存入名次数组中:
```
.MODEL SMALL
.STACK 100H
.DATA
cj DB 80, 90, 85, 70, 75, 95, 85, 80, 90, 85
mc DB 10 DUP(0)
.CODE
MOV AX, @DATA
MOV DS, AX
; 外层循环,遍历每个学生
MOV CX, 10
MOV BX, 0 ; BX 存储当前学生的分数
MOV DI, 0 ; DI 存储当前学生的名次
L1:
MOV BL, cj[BX]
; 内层循环,统计高于当前学生分数的学生数目
MOV SI, 0 ; SI 存储高于当前学生的分数
MOV DX, CX ; DX 存储剩余未遍历的学生数
L2:
CMP DX, 0
JE DONE
MOV AL, cj[SI]
CMP BL, AL
JGE SKIP
INC DI
SKIP:
INC SI
DEC DX
JMP L2
DONE:
MOV mc[BX], DI+1 ; 名次 = 高于当前学生数目 + 1
INC BX
DEC CX
CMP CX, 0
JNE L1
MOV AH, 4CH
INT 21H
END
```
程序中使用了两层循环,外层循环遍历每个学生,内层循环统计高于当前学生分数的学生数目。最终结果存储在名次数组mc中。
阅读全文