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:code
嵌入汇编实现:blog
注:addl %%ecx,%%ebx 实现的是 %%ebx+=%%ecx,即s+=arr[i]ip
上述代码是把输入先放到寄存器中,过程有些复杂,将代码改进以下:io
遇到的问题及解决:
课堂上没有作出来是由于题目要求在 main.c 中经过汇编调用 sum,根据以前所学用 int 0x80 实现系统调用,我一直在想怎么用汇编实现跳转 sum,而后我傻到本身修改了 eip 的值:asm
asm volatile( "movl %2,%%ecx\n\t" "movl %1,%%ebx\n\t" "movl $8b450c,%%eip"\n\t" :"=a"(s) :"b"(s),"c"(argc) ); }
下课后杨森同窗指出了个人错误,而后我又开始思考如何把 for 循环用汇编实现,很遗憾,此问题没有获得解决。我如今能作的,就是将 s=s+arr[i] 用汇编实现。循环
如何跳转 sum 函数以及 如何写 for 循环,但愿老师能帮忙解决一下。gc