汇编学习笔记->给定成绩数组排名次

编译环境: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 ,还凑合吧
代码虽短,但也应该要想着优化

发布了19 篇原创文章 · 获赞 2 · 访问量 4189

猜你喜欢

转载自blog.csdn.net/c529283955/article/details/103189430
今日推荐