Sorting 编写汇编语言程序,根据学生成绩对学生姓名进行排序
我想写一个简单的汇编语言程序,根据学生的成绩对他们的名字进行排序 我只是在使用:Sorting 编写汇编语言程序,根据学生成绩对学生姓名进行排序,sorting,assembly,x86-16,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
.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
将指向
名称、等级
结构或索引的指针排序到单独的名称和等级数组中
这是比较中的一个额外的间接级别,但不是在交换中。将指向
名称、等级
结构的指针或索引排序到单独的名称和等级数组中
这在比较中是一个额外的间接层次,但在交换中不是。很久以前,最常用的数据表示方法之一是使用所谓的固定长度字段。在这样一个地方找到所有相关数据并不罕见
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: 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,并将学生的地址添加到其中,这将为您提供一个指向适当名称的指针。英语需要改进,标点符号需要添加。计算机只能处理数字。学生的“名字”是你围绕它运行的所有代码对数字的错觉/解释,但在CPU内部,即使名字只是数字,CPU也不理解或看到任何其他东西。因此,首先搜索字符串在计算机中是如何编码的,以了解为什么“名称”只是数字,然后尝试理解strcmp
函数的实现,然后尝试理解该代码并修改它。英语需要改进,标点需要添加。计算机只与数字一起工作。学生的“名字”是你围绕它运行的所有代码对数字的错觉/解释,但在CPU内部,即使名字只是数字,CPU也不理解或看到任何其他东西。因此,首先搜索字符串在计算机中的编码方式,以了解为什么“名称”只是数字,然后尝试了解strcmp函数的实现,然后尝试理解该代码并修改它。使用mov si,Grades
,在第一次迭代中,没有任何有用的东西可以与cmp[si-4],al
进行比较!如果该代码以mov-si,Grades+2开始,并且至少有一名学生,则该代码可以工作。@SepRoland不知道我怎么会漏掉它,但在工作副本中Grades
实际上指向第二个元素。对于mov-si,Grades
,与cmp[si-4]相比没有任何用处,al
在第一次迭代中!如果该代码以mov si,Grades+2开始,并且至少有一名学生,则该代码可以工作。@SepRoland不知道我是怎么漏掉的,但在工作副本中,Grades
实际上指向第二个元素。我本打算将其作为注释发布,但不赞成将答案作为注释发布,这是一个答案,虽然是一个非常小的答案。我本来打算把它作为一个评论发布,但不赞成把答案作为评论发布,这是一个答案,尽管是一个非常小的答案。