我想编写一个简单的汇编语言程序,根据成绩对学生姓名进行排序。
我正在使用:
.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
答案 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
结构或指数的指针排序为单独的名称和等级数组。
比较中有一个额外的间接级别,但不在交换中。