无锡网站建设哪家做,网站下拉菜单设计,系部 网站建设方案,程序员培训机构有哪些week03 一、main参数传递二、反汇编三、汇编混合编程 一、main参数传递 参考 http://www.cnblogs.com/rocedu/p/6766748.html#SECCLA 在Linux下完成“求命令行传入整数参数的和” 注意C中main: int main(int argc, char *argv[]), 字符串“12” 转为12#xff0c;可以调用atoi… week03 一、main参数传递二、反汇编三、汇编混合编程 一、main参数传递 参考 http://www.cnblogs.com/rocedu/p/6766748.html#SECCLA 在Linux下完成“求命令行传入整数参数的和” 注意C中main: int main(int argc, char *argv[]), 字符串“12” 转为12可以调用atoi() 求和函数 int sum(int N)放入sum.c中, main中调用sum()main放入main.c中 测试代码传入自己的8位学号 提交代码 附件提交运行测试截图 // main.c:#includestdio.h
#includestdlib.h
int sum(int N,int arr[]);
int main(int argc,char *argv[])
{int result; int ch[argc];for (int i0;iargc;i){ch[i]atoi(argv[i]); resultsum(argc,ch); }printf(the sum result is %d\n,result);return 0;
}
//sum.c:int sum (int N,int arr[])
{int a0;for(int i0;iN;i){aarr[i];}return a;
}创建两个文件 一起编译然后运行
gcc main.c sum.c -o 20232831./20232831 2 0 2 3 2 8 3 1 #即计算2 0 2 3 2 8 3 1 的和需要用空格分开 二、反汇编
编辑、编译、运行附图中代码 上方提交代码 附件提交运行结果截图 代码如下
#includestdio.h
int main(void)
{int input,output,temp;input1;__asm__ __volatile__ (movl $0,%%eax;\n\tmovl %%eax,%1;\n\tmovl %2,%%eax;\n\tmovl %%eax,%0;\n\t:m(output),m(temp):r(input):eax);printf(%d %d\n,temp,output);return 0;
}三、汇编混合编程 用objdum -d sum.o反汇编sum.o 在main.c中通过汇编调用sum 上方提交C混合汇编代码 附件提交编译运行结果 sum.c和main.c代码如下
//sum.c
int sum (int N,int arr[])
{int a0;for(int i0;iN;i){aarr[i];}return a;
}
//main.c
#includestdio.h
#includestdlib.h
int sum(int N,int arr[]);
int main(int argc,char *argv[])
{int result; int ch[argc];for (int i0;iargc;i){ch[i]atoi(argv[i]); resultsum(argc,ch); }printf(the sum result is %d\n,result);return 0;
}过程如下
先生成sum.o
gcc -c sum.c -o sum.o对sum.c的反编译代码如下
objdump -d sum.o根据反汇编的代码对sum.c进行修改修改如下
#includestdio.h
int sum (int N,int arr[])
{int a0;for(int i0;iN;i){__asm__ __volatile__ (mov $0x0,%%rax;\n\t mov %%rax,%%rbx;\n\t start_loop:\tsub $0x1,%%rcx;\n\t cmp $0x0,%%rcx;\n\t jl loop_exit;\n\t mov (%%rsi,%%rcx,4),%%rbx;\n\t add %%rbx,%%rax;\n\t jmp start_loop;\n\t loop_exit::a(a):b(arr),c(N):memory);}return a;
}
对sum.c修改后再次编译运行结果如下 完成汇编混合编程