我正在尝试与我的朋友将用于对数字进行排序的汇编子程序与 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);
}