【发布时间】:2017-01-08 17:54:42
【问题描述】:
我目前正在尝试从 C 中调用汇编函数获得一些经验。因此,我创建了一个小程序来计算所有数组元素的总和。
C 代码如下所示:
#include <stdio.h>
#include <stdint.h>
extern int32_t arrsum(int32_t* arr,int32_t length);
int main()
{
int32_t test[] = {1,2,3};
int32_t length = 3;
int32_t sum = arrsum(test,length);
printf("Sum of arr: %d\n",sum);
return 0;
}
而汇编函数是这样的:
.text
.global arrsum
arrsum:
pushq %rbp
movq %rsp, %rbp
pushq %rdi
pushq %rcx
movq 24(%rbp),%rcx
#movq 16(%rbp),%rdi
xorq %rax,%rax
start_loop:
addl (%rdi),%eax
addq $4,%rdi
loop start_loop
popq %rcx
popq %rdi
movq %rbp , %rsp
popq %rbp
ret
我假设 C 遵循调用约定并将所有参数压入堆栈。事实上,在位置 24(%rbp) 我能够找到数组的长度。我希望在 16(%rbp) 处找到指向数组的指针,但我只是找到了 0x0。经过一些调试,我发现 C 根本没有推送指针,而是将整个指针移动到 %rdi 寄存器中。
为什么会这样?我找不到有关此行为的任何信息。
【问题讨论】:
-
如果您使用 gcc 或 clang,您可以在编译 C 文件时传递“-S”,它将转储出它生成的程序集。这可能会帮助您调试 C 代码正在执行的操作。
标签: c pointers assembly x86 x86-64