main参数传递、反汇编、汇编混合编程

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
#include               
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;
}

创建两个文件
main参数传递、反汇编、汇编混合编程_第1张图片
一起编译,然后运行

gcc main.c sum.c -o 20232831

./20232831 2 0 2 3 2 8 3 1 #即计算2 0 2 3 2 8 3 1 的和,需要用空格分开

main参数传递、反汇编、汇编混合编程_第2张图片

二、反汇编

编辑、编译、运行附图中代码
上方提交代码
附件提交运行结果截图
main参数传递、反汇编、汇编混合编程_第3张图片
代码如下:

#include
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;
}

main参数传递、反汇编、汇编混合编程_第4张图片

三、汇编混合编程

用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
#include               
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

main参数传递、反汇编、汇编混合编程_第5张图片

对sum.c的反编译代码如下:

objdump -d sum.o

main参数传递、反汇编、汇编混合编程_第6张图片
根据反汇编的代码对sum.c进行修改,修改如下:

#include
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修改后,再次编译运行,结果如下:
main参数传递、反汇编、汇编混合编程_第7张图片
完成汇编混合编程!

你可能感兴趣的:(汇编)