汇编语言编程:根据成绩数组cj中保存的10个学生的成绩,统计相应学生的名次并填入名次数组mc中 (提示:一个学生的名次等于成绩高于该学生的人数加1)。 测试用数据:学生成绩数组:46、68、88、87、76、89、99、65、100、80
时间: 2023-07-04 16:25:21 浏览: 156
显示学生名次
下面是使用汇编语言实现该功能的代码,运行环境为 x86 32位汇编:
```assembly
section .data
cj db 46, 68, 88, 87, 76, 89, 99, 65, 100, 80 ; 学生成绩数组
mc times 10 db 0 ; 名次数组,初始化为0
section .text
global _start
_start:
mov ecx, 10 ; 循环计数器,共有10个学生
mov ebx, cj ; ebx指向成绩数组
mov edx, mc ; edx指向名次数组
loop_start:
mov al, [ebx] ; al存储当前学生的成绩
mov esi, cj ; esi指向成绩数组
xor edi, edi ; edi存储成绩高于当前学生的人数,初始化为0
inner_loop_start:
cmp esi, ebx ; 比较当前学生的成绩和其他学生的成绩
jz inner_loop_end ; 如果指向当前学生,则跳过
mov bl, [esi] ; bl存储其他学生的成绩
cmp al, bl ; 比较当前学生和其他学生的成绩
jg inc_counter ; 如果当前学生的成绩比其他学生高,则计数器加1
inc_counter:
inc edi ; 成绩高于当前学生的人数加1
jmp inner_loop_end
inner_loop_end:
inc esi ; 指向下一个学生的成绩
cmp esi, cj + 10 ; 判断是否遍历完整个成绩数组
jne inner_loop_start
mov [edx], byte edi ; 将名次存储到名次数组中
inc edx ; 指向下一个名次
inc ebx ; 指向下一个学生的成绩
loop loop_start ; 循环处理下一个学生
; 测试代码,打印名次数组
mov ecx, 10 ; 循环计数器,共有10个学生
mov edx, mc ; edx指向名次数组
mov ebx, 1 ; 学生编号,从1开始
print_loop_start:
mov al, [edx] ; al存储当前学生的名次
add al, 48 ; 转换为ASCII码
mov [num], al ; 存储到num变量中
mov eax, 4 ; 调用write系统调用
mov ebx, 1 ; stdout文件描述符
mov ecx, num ; 输出的内容
mov edx, 1 ; 输出的长度
int 0x80
mov eax, 4 ; 调用write系统调用
mov ebx, 1 ; stdout文件描述符
mov ecx, comma ; 输出逗号
mov edx, 1 ; 输出的长度
int 0x80
inc ebx ; 下一个学生
inc edx ; 下一个名次
loop print_loop_start
; 退出程序
mov eax, 1
xor ebx, ebx
int 0x80
section .bss
num resb 1 ; 存储数字的变量
comma resb 1 ; 逗号
```
该程序先使用 `mov` 指令将循环计数器、成绩数组和名次数组的地址存储到寄存器中。然后使用两层循环遍历每个学生的成绩,并统计成绩高于该学生的人数。最后将该学生的名次存储到名次数组中。
最后,测试代码使用 `write` 系统调用打印名次数组。注意,每个数字后面要加上逗号。程序使用了一个 `num` 变量来存储数字,使用了一个 `comma` 变量来存储逗号。
阅读全文