2015-02-02(参数_返回值_局部变量_数组反汇编)

返回值要与返回类型匹配
image.png
image.png
返回之后赋值给i 也就是我们的申请的char变量
如果是short返回的话 用ax返回
image.png
猜测一下ax赋值给ebp-2

image.png

参数传递的本质

8位参数传递
在内存中还是以4字节存放 不存在传入一个字节内存大小的参数
参数传递的本质:将上层函数的变量,或者表达式的值“复制一份”,传递给下层函数.
本机尺寸

虽然内存是四字节 但是在实际使用中还是按照1字节使用

局部变量
小于32位的局部变量 在分配内存时候 还是按照32位的局部变量分配内存
image.png

使用时候按照实际的宽度使用
参数和局部变量没有区别
都是局部变量 都存放在栈中 完全可以把参数当作局部变量使用

#include<stdio.h>
short function()
{
return 0;
}
void Function(int x,int y,int z)
{

	z = 10;
}
int main()
{

Function(1,2,3);
return 0;
}

这里的z也可以当作局部变量使用因为也在堆栈中
参数是在函数调用初始的值
数组的本质
image.png

一堆等宽的变量 起了一个名字 叫数组
声明数组的长度必须是确定的
int arr[10] = {0};
编译器会利用循环 给数组赋值
赋值语句的本质

image.png

桶排序
1.创建int数组 看哪个数最大 创建int[max+1]={0};
2 4 6 5 3 1 2 7
0 0 0 0 0 0 0 0
第一个数是2 在下表为2的地方改为1
0 0 1 0 0 0 0 0
以此类推可得到
0 1 2 1 1 1 1 1
0 1 2 3 4 5 6 7
表的映射

下标为0 并不是1 说明要排序的数中没有0 有1代表存在这个数以此类推

0 1 2 2 3 4 5 6 7

缺点
最大的值最大的时候 并不是一个好的办法 间隔小 比较均匀
数组和循环一般在一起
练习01

1、返回值超过32位时,存在哪里?用long long(__int64)类型做实验			
			
long long类型在VC6中对应的是__int64			
			
__int64 Function()			
{			
	__int64 x = 0x1234567890;		
	return x;		
}			

image.png
可以看到局部变量是分开存放两个32位的内存地址中 返回的时候也是放在俩个32位的寄存器返回的 edx存放高位 eax地位
练习02
image.png

2、char arr[3] = {1,2,3};与 char arr[4] = {1,2,3,4};					
哪个更节省空间,从反汇编的角度来说明你的观点

可以看到我们申请了3个char 分配了四个字节 申请了四个char 也是四个字节 不是局部变量的char和short都是作为int申请内存分配 如果我们数组是10个char元素呢 分配的空间应该是 0x4C 验证一下

image.png

可以看到就是4C 同时下面赋值也不是循环赋值 因为我们每个数组元素都不一样 所以是单个赋值 开辟的是4c 但是使用的时候还是作为char类型占一个字节使用
image.png

练习03

3、找出下面赋值过程的反汇编代码

void Function()		
{		
	int x = 1;	
	int y = 2;	
	int r;	
	int arr[10] = {1,2,3,4,5,6,7,8,9,10};	
		
	r = arr[1];	
	r = arr[x];	
	r = arr[x+y];	
	r = arr[x*2+y];	
}		

反汇编代码

23:       int x = 1;
00401128   mov         dword ptr [ebp-4],1
24:       int y = 2;
0040112F   mov         dword ptr [ebp-8],2
25:       int r;
26:       int arr[10] = {1,2,3,4,5,6,7,8,9,10};
00401136   mov         dword ptr [ebp-34h],1
0040113D   mov         dword ptr [ebp-30h],2
00401144   mov         dword ptr [ebp-2Ch],3
0040114B   mov         dword ptr [ebp-28h],4
00401152   mov         dword ptr [ebp-24h],5
00401159   mov         dword ptr [ebp-20h],6
00401160   mov         dword ptr [ebp-1Ch],7
00401167   mov         dword ptr [ebp-18h],8
0040116E   mov         dword ptr [ebp-14h],9
00401175   mov         dword ptr [ebp-10h],0Ah
27:
28:       r = arr[1];
0040117C   mov         eax,dword ptr [ebp-30h]
0040117F   mov         dword ptr [ebp-0Ch],eax    
29:       r = arr[x];
00401182   mov         eax,dword ptr [ebp-4]
00401185   mov         ecx,dword ptr [ebp+eax*4-34h]
00401189   mov         dword ptr [ebp-0Ch],ecx
30:       r = arr[x+y];
0040118C   mov         eax,dword ptr [ebp-4]
0040118F   add         eax,dword ptr [ebp-8]
00401192   mov         ecx,dword ptr [ebp+eax*4-34h]
00401196   mov         dword ptr [ebp-0Ch],ecx
31:       r = arr[x*2+y];
00401199   mov         eax,dword ptr [ebp-4]
0040119C   mov         ecx,dword ptr [ebp-8]
0040119F   lea         edx,[ecx+eax*2]
004011A2   mov         eax,dword ptr [ebp+edx*4-34h]
004011A6   mov         dword ptr [ebp-0Ch],eax
32:   }

04练习
桶排序代码实现
自己写的屎山代码

#include <stdio.h>
#include <stdlib.h>
int main()
{

	//[29, 25, 3, 49, 9, 37, 21, 43]

	int arr[50]={0};
	int exampl[8]={29, 25, 3, 49, 9, 37, 21, 43};
	int i ;
	int j ;
	int k ;

		for (j=0;j<8;j++)
		{
			for (i=0;  i<50; i++)
			{
				if (exampl[j]-1 == i)
				{
					arr[i] =1;
					continue;
				}
			
			}

		}
    
	for (k = 0;k<50;k++)
	{
		if (arr[k] == 1)
		{
printf("%d  ",k+1);
		}
		
	}

system("pause");
	
}

经过豆包指点修改为以下代码

#include <stdio.h>
#include <stdlib.h>
int main()
{
	int arr[50]={0};
	int exampl[8]={29, 25, 3, 49, 9, 37, 21, 43};
	int i ;
	int j ;
	int k ;

	for (j=0;j<8;j++)
	{
		i = exampl[j] - 1;
		arr[i] = 1;
	}
    
	for (k = 0;k<50;k++)
	{
		if (arr[k] == 1)
		{
			printf("%d  ",k+1);
		}
	}

	system("pause");
	return 0;
}
上一篇 C语言正向05_作业练习
因特叁

因特叁管理员

动物世界

本月创作热力图

少
多
目录