编写汇编语言程序,根据成绩对学生姓名进行排序
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
,这将为您提供指向适当名称的指针。
我想编写一个简单的汇编语言程序来根据成绩对学生姓名进行排序。
我正在使用:
.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
,这将为您提供指向适当名称的指针。