您现在的位置是:首页 >技术教程 >第八章 复杂数据类型的机器级表示网站首页技术教程

第八章 复杂数据类型的机器级表示

奶茶拌火锅 2023-05-13 08:00:04
简介第八章 复杂数据类型的机器级表示

1、数组和指针类型的分配和访问

1.1、数组的分配与访问

1、分配在静态区的数组的初始化和访问

int buf[2] = {10,20};
int main()
{
	int i,sum = 0;
	for(i = 0;i < 2;i++)
		sum += buf[i];
	return sum;
}

buf是在静态区分配的数组,链接后,buf在可执行目标文件的数据段中分配了空间
08049080 :
08049080:0A 00 00 00 14 00 00 00

此时,buf=&buf[0]=0x08049080 编译器通常将其先存放到寄存器(如EDX)中。
假定i被分配在ECX中,sum被分配在EAX中,则“sum += buf[i];” 和 i++ 可用什么指令实现?
addl buf(,%ecx,4),%eax或addl 0(%edx,%ecx,4),%eax addl &1,%ecx

2、auto型数组的初始化和访问

int adder()
{
	int buf[2] = {10,20};   
	int i,sum = 0;
	for(i=0;i<2;i++)
		sum+=buf[i];
	return sum;

}

buf 分配在栈中,故数组首址通过EBP来定位。

对buf进行初始化的指令是什么?
movl $10,-8(%ebp) //buf[0]的地址为R[ebp]-8,将10赋给buf[0]
movl $20 -4(%ebp) //buf[1]的地址为R[ebp]-4,将20赋给buf[1]

若buf首址在EDX中,则获得buf首址的对应指令是什么?
leal -8(%ebp),%edx //buf[0]的地址为R[ebp]-8,将buf首址送EDX

1.2、数组与指针的关系

数组与指针
在指针变量目标数据类型与数组类型相同的前提下,指针变量可以指向数组或数组中任意元素
以下两个程序段功能完全相同,都是使ptr指向数组a的第0个元素a[0]。a的值就是其首地址,即a=&a[0],因而a=ptr,从而有&a[i]=ptr + i = a + i以及a[i]=ptr[i]=(ptr+i)=(a+1)。

1.3、指针数组和多维数组

指针数组:由若干指向同类目标的指针变量组成的数组
定义:存储类型 数据类型 *指针数组名[元素个数]
例如,“int *a[10];”定义了一个指针数组a,它有10个元素,每个元素都是一个指向int型数据的指针。
一个指针数组可以实现一个二维数组。

2、结构和联合数据类型的分配和访问

2.1、结构类型的分配和访问

结构体成员在内存的存放和访问
分配在栈中的auto结构性变量的首地址由EBP或ESP来定位
分配在静态区的结构型变量首地址是一个确定的静态区地址
结构性变量x各成员首址可用“基址加偏移量”的寻址方式

struct cont_info{			若变量x分配在地址0x8049200开始的区域
	char id[8];					x=&(x.id)=0x8049200(若x在EDX中)
	char name[12];			&(x.name)=0x8049200+8=0x8049208
	unsigned post;			&(x.post)=0x8049200+8+12=0x8049214
	char address[100];		&(x.address)=0x8049200+8+12+4=0x8049218
	char phone[20];			&(x.phone)=0x80449200+8+12+4+100=0x804927C

}

2.2、联合类型的分配和范围跟

3、数据的对齐存放

3.1、数据的对齐方式

3.2、数据的对齐方式举例

4、越界访问和缓冲区溢出攻击

4.1、越界访问和缓冲区溢出攻击

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。