【问题标题】:Sorting through an array after filling in x86 MASM assembly language填充x86 MASM汇编语言后对数组进行排序
【发布时间】:2021-01-13 13:19:41
【问题描述】:

谁能帮我解决这个问题,我是汇编语言的新手,有点坚持下一步该做什么。代码如下:

.data
evenStart    dword          11h
oddStart     dword          20h
darray       dword          15 dup (?)
.code
main PROC
    mov esi, OFFSET darray
    xor ecx, ecx
    
L1: 
    mov ebx, OFFSET evenStart
    test cl,1
    jz iseven
    mov ebx, OFFSET oddStart
    
iseven:
    mov eax, [ebx]
    inc dword ptr [ebx]
    mov dword ptr [esi + 4*ecx],eax
    inc ecx
    cmp ecx,15
    jb L1
    
    exit
main ENDP
END main

所以项目需要我填充未初始化的数组,我这样做了。但随后它也要求我对这个数组进行降序排序,然后将数组的中间元素放入 eax 寄存器并调用 DumpRegs。这是我陷入困境的部分。有关如何进行的任何帮助都会很棒。谢谢!

【问题讨论】:

  • 你的意思是向后循环,因为你知道它从填充它有这个交替的升序,所以向后倒是降序?或者您是否应该通过对数组进行排序来实际修改数组,就像使用 InsertionSort 一样? (而不是“排序”;英文措辞可能意味着搜索它)。
  • @PeterCordes 我的意思是实际上对数组进行排序,例如,如果数组由 15 20 11 14 组成,排序后将是 20 15 14 11。类似的东西。
  • 好的,这是一个常见问题,已经解决了很多次。如果您想了解其他人如何实现双字数组的排序,请在 Google 上找到答案。除非您应该利用基于奇数/偶数初始化程序的已知内容,并通过单个循环将数组重写为排序顺序?
  • @PeterCordes 是的,这正是我在这里想要实现的,因为大多数数组排序都已经初始化了整个数组。在这种情况下,我必须用基于奇数/偶数初始化器的值填充数组,所以我不知道如何处理它。我认为我的代码中还会有另一个循环,但我不确定。
  • 嗯,简单的事情就是填充数组然后对其进行排序。是的,在第一个循环结束后,只需编写第二个循环(这将是一个嵌套循环;简单的排序算法是 O(n^2))。与其他编程语言一样,您可以将 2 个独立的东西一个接一个地放置。

标签: arrays sorting assembly x86


【解决方案1】:

下一个冒泡排序使用嵌套循环。因为您的数组有 15 个元素,所以外部循环在其第一次迭代期间可以进行 14 次比较。对于外部循环的每次迭代,它必须少做 1 次比较,因为最小的元素已经冒泡到数组的末尾。

    mov ebx, 15-1      ; Outer loop iteration count
OuterLoop:
    mov esi, offset darray

    mov ecx, ebx       ; Inner loop iteration count
InnerLoop:
    lodsd
    mov edx, [esi]
    cmp eax, edx
    jge Skip
    mov [esi-4], edx   ; Swap these 2 elements
    mov [esi], eax
Skip:
    dec ecx
    jnz InnerLoop

    dec ebx
    jnz OuterLoop

未排序的数组: 11h, 20h, 12h, 21h, 13h, 22h, 14h, 23h, 15h, 24h, 16h, 25h, 17h, 26h, 18h

排序后的数组: 26h, 25h, 24h, 23h, 22h, 21h, 20h, 18h, 17h, 16h, 15h, 14h, 13h, 12h, 11h

在这个包含奇数个元素 (15) 的数组中,元素索引的范围从 0 到 14。在索引 7 处有一个真正的中间元素。

【讨论】:

  • 为什么选择冒泡排序?插入排序是一种更好的算法,也易于实现。
  • @PeterCordes 我认为我们所说的“简单”在这种情况下仍然具有挑战性。
  • 我的意思是“对我们来说很容易”,他们知道 asm 并且正在写答案。既然您选择显示哪种排序算法作为示例,为什么显示the worst one?特别是因为在 Stack Overflow 上到处都有它的现有示例,所以我们可以将其作为冒泡排序问题的副本关闭。如果您只是想编写一个干净紧凑的冒泡排序,还有其他问答可以发布,例如Assembly bubble sort swap
  • Jerry Coffin 在评论中发布了类似的插入排序:Assembly bubble sort swap
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多