编译环境:emu8086
附:汇编常用跳转指令及其检测位
https://blog.csdn.net/c529283955/article/details/103015482
使用双重循环对给定的学生成绩数组进行排名次
ax 存放当前学生的成绩
bx 存放当前学生在数组中的相对地址指针
cx 内循环计数器
dx 存放当前学生的名次(遍历到一名成绩更高的学生则名次向后+1)
si 在内循环中存放其他学生的相对地址指针
di 外循环计数器
datas segment
grade dw 88,75,95,63,98,78,87,73,90,60
rank dw 10 dup(0)
datas ends
codes segment
assume cs:codes,ds:datas,es:datas
start:
mov ax,datas ;标准开局
mov ds,ax
mov es,ax
mov di,10 ;外循环计数
mov bx,0 ;当前学生的相对地址指针置0
outloop:
mov ax,grade[bx] ;取出一名学生的成绩到ax中
mov dx,0 ;将该学生名次置0
mov cx,10 ;置内循环计数为10,将该学生的成绩与数组中所有成绩都比较一遍,总共10次(包括与自身进行比较)
lea si,grade ;取得成绩数组的首地址
next:
cmp ax,[si] ;注意:此处si保存的是地址,要比较值,所以要[si]
jg no_count ;jump when greater,若当前学生的成绩比[si]大,则名次保持不变
inc dx ;否则将名次+1(和自身比较时也会+1,因此置0是必要的)
no_count:
add si,2 ;向后偏移2个地址(1个字word=2个字节byte),取出下一位学生的成绩与该学生进行比较
loop next ;继续比较,此处使用cx作为内循环计数器
mov rank[bx],dx ;10次循环过后,已经将该学生的成绩确定,因此将dx中的值(名次)保存到rank数组中的对应位置
add bx,2 ;开始下一轮比较
dec di ;外循环次数-1
jne outloop ;若外循环次数[di]不为0,则继续外循环
mov ah,4ch
int 21h
codes ends
end start
每一个学生都和数组中的学生比较了10次,10x10=100,复杂度n2 ,还凑合吧
代码虽短,但也应该要想着优化