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

时间:2018-01-17 11:51:00

标签: sorting assembly x86-16

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

我正在使用:

.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

2 个答案:

答案 0 :(得分:3)

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

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的地址添加到其中,这将为您提供指向相应名称的指针。

答案 1 :(得分:-1)

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

比较中有一个额外的间接级别,但不在交换中。