Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 编写汇编语言程序,根据学生成绩对学生姓名进行排序_Sorting_Assembly_X86 16 - Fatal编程技术网

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
实际上指向第二个元素。我本打算将其作为注释发布,但不赞成将答案作为注释发布,这是一个答案,虽然是一个非常小的答案。我本来打算把它作为一个评论发布,但不赞成把答案作为评论发布,这是一个答案,尽管是一个非常小的答案。