汇编程序子程序用于修改C数组

时间:2013-01-25 21:04:43

标签: arrays sorting assembly x86-64 subroutine

我正在尝试链接一个汇编器子程序,用于将数字与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);
}

1 个答案:

答案 0 :(得分:0)

你似乎正在关注微软呼叫约定,你在Windows上吗?

无论哪种方式,这看起来都非常错误:add rsp, 800。您是否可能意味着sub分配一些空间? (但是你在开始时已经有sub,所以你可以调整那里的值。

如果它仍然不起作用,请使用调试器逐步执行代码并查看它出错的地方。