您现在的位置是:首页 >技术教程 >第八章 复杂数据类型的机器级表示网站首页技术教程
第八章 复杂数据类型的机器级表示
复杂数据类型的机器级表示
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
}