在汇编中仅排序奇数/偶数,如何在不使用已分配的内存的情况下复制数组?

时间:2017-11-29 12:58:55

标签: arrays sorting assembly nasm

TL; DR:如何将元素从一个数组复制到另一个数组(不是除了一些数组)?

我想在某个数组上执行排序算法,但是我只根据标志对其中的奇数或偶数进行排序。所以我的想法是在01上设置一个标志,然后我将所有必须排序的数字提取到另一个数组并放入-1(作为标记)在这些数字的位置。之后,我只需将已排序的数字插回到原始数组中,例如:

arr1:5 8 2 4 13 9 14 10 9

arr2:8 2 4 14 10

arr2(已排序):2 4 8 10 14

arr1(没有偶数):5 -1 -1 -1 13 9 -1 -1 9

arr1(最终):5 2 4 8 13 9 10 14 9

现在用更高的语言写这篇文章对我来说是相当微不足道的,在汇编中这样做我正在为一堂课学习而不是。我对数字进行排序的部分工作正常,但导致我出现问题的部分是我必须将数字复制到另一个数组中的部分。我的主要方法如下:

section .data
    arr dd 6,8,1,7,4,2,9,107,10,8,12,16,14,5
    len equ ($-arr) / 4 - 1
section .bss
section .text
extern sort
global _start
_start:
    mov r8, len
    mov esi, arr ; esi points to the start of the array/top of it
    call sort
mov rax, 60
mov rdi, 0
syscall

将完成工作的子程序(仅显示有问题的部分):

 mov r9d, esi

    .export:
        mov eax, [r9d]
        cdq 
        div dword [divider]
        cmp edx, [flag]
        je .add
        .continue:
            add r9d, 4 ; point to the next number
            inc dword [i]
            cmp r8d, [i]
            jg .export

.add:
    mov edi, [r9d]
    mov dword [r9d], -1 ; put the number in the old array to -1
    sub edi, 4
    inc dword [lenNewArray] ; inc the total number of elements in new array
    jmp .continue

无论如何,我想要完成的是我添加一个与条件匹配的元素到某个位置,然后将rdi指向该位置,当我想添加另一个元素时,我从{减去-4 {1}}所以它指向较低的位置并将该元素放在那里,最后我将rdi指向最后提取的元素,是否可以完成,这是不是很糟糕方式是什么?

0 个答案:

没有答案