编写汇编语言程序,根据成绩对学生姓名进行排序

Write assembly language program to sort student names according to their grades

我想编写一个简单的汇编语言程序来根据成绩对学生姓名进行排序。

我正在使用:

.data
.code

我尝试了这种冒泡排序,但这个仅适用于数字。如何为学生添加姓名?

.data

array  db 9,6,5,4,3,2,1

count  dw 7

.code

mov cx,count      
dec cx  

nextscan:          
mov bx,cx
mov si,0 

nextcomp:

mov al,array[si]
mov dl,array[si+1]
cmp al,dl

jnc noswap 

mov array[si],dl
mov array[si+1],al

noswap: 
inc si
dec bx
jnz nextcomp

loop nextscan

将指向 name, grade 结构的指针或索引排序到单独的名称和等级数组中。

这是比较中的额外一级间接,但不是交换中的。

很久以前,表示数据的最常见方式之一是使用所谓的固定长度字段。像这样在一个地方找到所有相关数据的情况并不少见;

Student:   db    72, 'Marie           '
           db    91, 'Barry           '
           db    83, 'Constantine     '
           db    59, 'Wil-Alexander   '
           db    97, 'Jake            '
           db    89, 'Ceciel          '

这是可行的,因为每个字段的长度都是 16 个字节,这也是过去以 2 的倍数构造数据的方式。因此数据长度为 2、4、8、16、32、64等等。不一定是这样,很多时候也不是,但是这样的倍数使代码更简单。

问题是,每次我们要排序的时候,所有的数据都得移动,于是关系数据库就诞生了。这里我们把可变数据和静态数据分开。

Student:   db    'Marie           '
           db    'Barry           '
           db    'Constantine     '
           db    'Wil-Alexander   '
           db    'Jake            '
           db    'Ceciel          '

Grades:    db    72, 0
           db    91, 1
           db    83, 2
           db    59, 3
           db    97, 4
           db    89, 5
           dw    -1                ; Marks end of list

这不仅在程序中更容易管理,而且为同一个人添加更多等级甚至等级也更容易。这是代码如何进行比较的示例。

            mov     si, Grades
            mov     bl, 0
            push    si

        L0: lodsw
            cmp     ax, -1
            jz      .done

            cmp     [si-4], al
            jae     L0

          .... Exchange Data Here ....

            bts     bx, 0
            jmp     L0

        .done:
            pop     si
            btc     bx, 0
            jc      L0 - 1

            ret

例程执行后成绩内容如下;

61 04 5B 01 59 05 53 02 48 00 3B 00

我确实有一个在 DOSBOX 中测试过的该程序的工作副本,因为这是一项家庭作业,我不会把它放在银盘上交给你,但 95% 的工作已经完成。在提交之前,您需要做的就是确保您可以解释为什么 BTS & BTC 使气泡起作用并实现一些可以交换数据的东西。

如果你需要显示这些数据,你需要设置一个从二进制到十进制的转换程序,但只需将索引号乘以与每个等级相关的 16 并添加地址 Student ,这将为您提供指向适当名称的指针。