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:#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修改后,再次编译运行,结果如下:
完成汇编混合编程!