我正在尝试链接一个汇编器子程序,用于将数字与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);
}
答案 0 :(得分:0)
你似乎正在关注微软呼叫约定,你在Windows上吗?
无论哪种方式,这看起来都非常错误:add rsp, 800
。您是否可能意味着sub
分配一些空间? (但是你在开始时已经有sub
,所以你可以调整那里的值。
如果它仍然不起作用,请使用调试器逐步执行代码并查看它出错的地方。