【发布时间】:2021-04-18 16:49:55
【问题描述】:
我目前正在学习如何将 C 代码转换为汇编 x86 64 位代码。我的代码是:
long add_arrays(long *arr1, long *arr2, unsigned long num, long *result)
{
unsigned long sum = 0, i = 0;
while(i < num) {
result[i] = arr1[i] + arr2[i];
sum = sum + result[i];
i++;
}
return sum;
}
当我将它转换为程序集时,我得到一个 0 或地址号的输出。我的代码是:
.global add_arrays_asm
add_arrays_asm:
xor %r8, %r8
while_start:
cmp %r8, %rdx
jge while_break
movq (%rdi, %r8, 8), %r9
addq (%rsi, %r8, 8), %r9
movq (%rcx, %r8, 8), %r10
movq (%r9, %r8, 8), %rcx
addq (%r10, %r8, 8), %rax
addq (%rcx,%r8, 8), %rax
inc %r8
jmp while_start
while_break:
ret
我用来测试的代码是:
printf("Testing add_arrays_asm\n");
long l3[] = {3, 23, 32, 121, 0, 43, 95, 4};
long l4[] = {-823,12,-1222,84834, -328, 0, 9, -1387};
long res1[] = {0, 0, 0, 0, 0, 0, 0, 0};
long sum1 = add_arrays_asm(l3, l4, 8, res1);
int j = 0;
for(j = 0; j < 8; j++) {
printf("%8ld + %8ld = %8ld\n", l3[j], l4[j], res1[j]);
}
printf(" Sum = %ld\n\n", sum1);
我是汇编编码的新手,所以我找不到代码出错的地方。任何帮助,将不胜感激。谢谢。
【问题讨论】:
-
movq (%rcx, %r8, 8), %r10: 将result[i]的值加载到寄存器有什么意义,因为它只是您打算覆盖的垃圾(但您实际上从未这样做,另一个错误)?movq (%r9, %r8, 8), %rcx:对此的评论是不准确的:它实际上类似于rcx = r9[i]。由于r9包含了添加arr1[i]+arr2[i]的结果,而且这不是指针,所以这一行没有意义,很可能会崩溃。