0

我正在尝试与我的朋友将用于对数字进行排序的汇编子程序与 C 代码链接以进行小组作业,但我们无法使其正常工作。排序算法(Shellsort)之前已经作为一个单独的程序进行了测试,应该可以工作。

我们使用 mysort 方法来调用修改数组的例程:

void mysort (uint32_t array[], uint32_t len);

我们将文件中的输入数字读入数组:

len = read(f, array, ARRAY_SIZE*4);

我们这样调用排序例程:

 mysort(array, len>>2);

最后,我们将数组写回文件。问题是我们的输出是一个数组,其中包含按相同顺序排列的原始数字,而不是按照应有的顺序进行排序。我们通过 RCX 寄存器将指向数组的指针传递给数组,因为这是在 Intel-64 中传递函数参数的方式。由于老师给了我们C源代码,我们怀疑我们的汇编代码做错了什么。

任何意见,将不胜感激。提前致谢!

这是我们的日常:

section .text

global mysort

mysort:
    push rbp
    mov rbp,rsp
    sub rsp, 8
    mov r10, rcx    ; r10 -> pointer to array
    mov r11, rdx    ; r11 -> length
; The gaps
    add rsp, 800
    mov r13, 10
    mov [rsp], r13
    mov r13, 4
    mov [rsp+8], r13
    mov r13, 1
    mov [rsp+16], r13
    xor rax, rax             ; l := 0
gaploop:
    mov rbx, [rsp+4*rax]   ; rbx -> current gap value
    mov rcx, rbx             ; rcx -> i
insertionsort_outerloop:
    cmp rcx, r11    ; compare i with n
    jge endouterloop
    mov edx, [r10+4*rcx];edx -> temp
    mov rsi, rcx        ;rsi -> j
insertionsort_innerloop:
    mov rdi, rsi    ;
    sub rdi, rbx    ;rdi -> j-gap
    mov r8d, [r10+4*rdi]
    cmp rsi, rbx    ; compare j with gap
    jl endofloop    ; jump to end of loop if j < gap
    cmp r8d, edx    ; compare a[j-gap] with temp
    jna endofloop   ; jump to end of loop if a[j-gap] not greater than temp
    mov [r10+4*rsi], r8d
    sub rsi, rbx
    jmp insertionsort_innerloop 
endofloop:
    mov [r10+4*rsi], edx        ; a[j] := temp
    inc rcx     ; i++
    jmp insertionsort_outerloop
endouterloop:
    inc rax     ; l++
    cmp rax, 1  ; cmp eax with length of gaps
    jle gaploop
    mov rsp,rbp
    pop rbp
    ret 

和 C 代码:

#define ARRAY_SIZE 32768
void mysort (uint32_t array[], uint32_t len);

int main(int argc, char *argv[])
{
    int f,n;
    uint32_t array[ARRAY_SIZE];
    uint64_t len;
    if (argc < 2) {
        printf("Usage: %s input_file output_file\n", argv[0]);
        exit (0);
    }
    printf("Opening %s\n", argv[1]);
    f = open(argv[1], O_RDONLY);
    printf("Input file opened\n");
    len = read(f, array, ARRAY_SIZE*4);
    printf("File size is %u bytes (%lu numbers)\n", len, len/4);
    close (f);
    printf("Sorting...");
    mysort(array, len>>2);
    printf("done\n");
    printf("Opening %s for writing\n", argv[2]);
    f = open(argv[2], O_WRONLY | O_CREAT, 0644);
    printf("File descriptor %d; errno = %d\n", f, errno);
    n = write(f, array, len);
    printf("Written %d bytes; errno = %d\n", n, errno);
    close(f);
    return(0);
}
4

1 回答 1

0

你似乎遵循微软的调用约定,你在 Windows 上吗?

无论哪种方式,这看起来都非常错误:add rsp, 800. 你是不是想sub分配一些空间?(但你一开始就已经有了sub,所以你可以在那里调整值)。

如果它仍然不起作用,请使用调试器单步执行代码并查看哪里出错了。

于 2013-01-25T22:56:48.240 回答