sum.c 文件为:
#include<stdio.h>
int sum(int N,int arr[])
{
int s=0;
int i;
for(i=0;i<N;i++)
s+=arr[i];
return s;
}
用objdump -d sum.o 反汇编 sum.o:
嵌入汇编实现:
注:addl %%ecx,%%ebx 实现的是 %%ebx+=%%ecx,即s+=arr[i]
上述代码是把输入先放到寄存器中,过程有些复杂,将代码改进如下:
遇到的问题及解决:
课堂上没有做出来是因为题目要求在 main.c 中通过汇编调用 sum,根据之前所学用 int 0x80 实现系统调用,我一直在想怎么用汇编实现跳转 sum,然后我傻到自己修改了 eip 的值:
asm volatile(
"movl %2,%%ecx
"
"movl %1,%%ebx
"
"movl $8b450c,%%eip"
"
:"=a"(s)
:"b"(s),"c"(argc)
);
}
下课后杨森同学指出了我的错误,然后我又开始思考如何把 for 循环用汇编实现,很遗憾,此问题没有得到解决。我现在能做的,就是将 s=s+arr[i] 用汇编实现。
如何跳转 sum 函数以及 如何写 for 循环,希望老师能帮忙解决一下。