gpt4 book ai didi

assembly - 在 x86 NASM 或 YASM 程序集中实现选择排序的麻烦

转载 作者:行者123 更新时间:2023-12-04 05:48:40 26 4
gpt4 key购买 nike

我正在尝试在 64 位 Linux 上运行的 NASM 中实现一个数组的选择排序。

数组声明为:

section .bss
strbuf resb 10
small resb 1 ; current minimum value

排序算法本身很简单,但我觉得受到两件事的限制:可用寄存器的数量,以及无法交换立即数(即括号)

我需要跟踪未排序的数组边界、它的索引、当前最小值的位置以及它的索引。那已经是四个寄存器了。我还需要跟踪两个循环计数器,一个用于表示未排序数组边界的外部循环,另一个用于每次遍历的迭代(即内部循环)。那是另外两个,总共六个寄存器。

由于立即数不能相互移动,例如 mov [var1], [var2]每当我需要交换两个元素时,我都需要使用寄存器作为临时占位符。在跟踪哪些寄存器保存哪些信息方面,这很快变得笨拙!

以下是我迄今为止的尝试。请注意这是 非工作代码 触发段错误。但也许你能察觉到我想要做什么,并指出我的方法哪里出了问题。

我不希望使用简化结构的宏,例如那些提供 .IF 和 .ELSE 的宏。
; ====== Sorting begins here ======
sorting:
mov edi, strbuf ; outer loop pointer
mov esi, strbuf ; inner loop pointer
mov eax, 0 ; inner loop counter
mov ebx, 0 ; outer loop counter

innerloop:
; store the value of first element in [small]
mov edx, [esi]
mov [small], edx

; compare the current small value with the value pointed by esi
mov edx, [esi]
cmp [small], edx

jg new_small
inc esi
inc eax
cmp eax, 9
jle innerloop
cmp eax, 9
jg innerloop_done

new_small:
mov [small], edx ; save the new small value
mov ecx, esi ; save its index in ecx
inc esi
inc eax
cmp eax, 9

jle innerloop

innerloop_done:
; When the inner loop is completed...
; First, do the swap
push rax
mov eax, [edi]
mov edx, [small]
mov [ecx], edx
pop rax

inc edi ; move the outer loop pointer forward
inc esi ; move the inner loop pointer forward
inc ebx ; increment the outer loop counter (the unsorted array becomes smaller)
inc eax ; increment the inner loop counter (same reason as above)
cmp ebx, 9

jle innerloop

; ====== Sorting ends here ======

最佳答案

如果这应该在 64 位模式下执行,则必须使用 64 位地址,这意味着当您获取这些地址并将它们放入寄存器时,这些接收寄存器也必须是 64 位的,否则您将截断地址和访问内存不是你想要的。

另外,您没有调试器来单步执行您的代码吗?

关于assembly - 在 x86 NASM 或 YASM 程序集中实现选择排序的麻烦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10370476/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com