参考 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:
#include<stdio.h>
#include<stdlib.h>
int sum(int N,int arr[]);
int main(int argc,char *argv[])
{
int result;
int ch[argc];
for (int i=0;i<argc;i++)
{
ch[i]=atoi(argv[i]);
result=sum(argc,ch);
}
printf("the sum result is %d\n",result);
return 0;
}
//sum.c:
int sum (int N,int arr[])
{
int a=0;
for(int i=0;i<N;i++){
a+=arr[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 的和,需要用空格分开
编辑、编译、运行附图中代码
上方提交代码
附件提交运行结果截图
代码如下:
#include<stdio.h>
int main(void)
{
int input,output,temp;
input=1;
__asm__ __volatile__ (
"movl $0,%%eax;\n\t"
"movl %%eax,%1;\n\t"
"movl %2,%%eax;\n\t"
"movl %%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 a=0;
for(int i=0;i<N;i++){
a+=arr[i];
}
return a;
}
//main.c:
#include<stdio.h>
#include<stdlib.h>
int sum(int N,int arr[]);
int main(int argc,char *argv[])
{
int result;
int ch[argc];
for (int i=0;i<argc;i++)
{
ch[i]=atoi(argv[i]);
result=sum(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进行修改,修改如下:
#include<stdio.h>
int sum (int N,int arr[])
{
int a=0;
for(int i=0;i<N;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修改后,再次编译运行,结果如下:
完成汇编混合编程!