南京大学计算机基础2课件-第八章 复杂数据类型的机器级表示.pdfVIP

  • 0
  • 0
  • 约2.12万字
  • 约 41页
  • 2022-12-21 发布于四川
  • 举报

南京大学计算机基础2课件-第八章 复杂数据类型的机器级表示.pdf

第八章 数组和指针类型的分配和访问 数组的分配和访问 • 数组元素在内存的存放和访问 – 例如,定义一个具有4个元素的静态存储型 short 数据 类型数组A,可以写成“static short A[4];” – 第 i(0≤i≤3)个元素的地址计算公式为A[0]+2*i。 – 假定数组A的首地址存放在EDX中,i 存放在ECX中, 现要将A[i]取到AX中,则所用的汇编指令是什么? movw (%edx, %ecx, 2), %ax 比例因子是2! 其中,ECX为变址(索引)寄存器 ,在循环体中增量, 数组的分配和访问 • 填写下表 数组的分配和访问 • 填写下表 数组元素在内存的存放和访问 • 分配在静态区的数组的初始化和访问 int buf[2] = {10, 20}; buf是在静态区分配的数组,链接后,buf int main ( ) 在可执行目标文件的数据段中分配了空间 { int i, sum=0; buf: for (i=0; i2; i++) 0A 00 00 00 14 00 00 00 sum+=buf[i]; return sum; 此时,buf=buf[0]=0 } 编译器通常将其先存放到寄存器(如EDX)中 假定 i 被分配在ECX中,sum被分配在EAX中,则 “sum+=buf[i];”和 i++ 可用什么指令实现? addl buf( , %ecx, 4), %eax 或 addl 0(%edx , %ecx, 4), %eax addl 1,%ecx 数组元素在内存的存放和访问 • auto型数组的初始化和访问 int adder ( ) { -4 int buf[2] = {10, 20}; 分配在栈中, -8 int i, sum=0; 故数组首址通 for (i=0; i2; i++) 过EBP来定位 sum+=buf[i]; return sum; EDX、ECX各是什么? } addl (%edx, %ecx, 4), %eax 对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 数组元素在内存的存放和访问 • 数组与指针  在指针变量目标数据类型与数组 类型相同的前提下,指针变量可 以指向数组或数组中任意元素  以下两个程序段功能完全相同, 都是使ptr指向数组a的第0个元 素a[0]。a的值就是其首地址, 即a=a[0],因而a=ptr,从而 有a[i]=ptr+i=a+i以及 a[i]=ptr[i]=*(ptr+i)=*(a+i)。 (1)int a[10]; 小端方式下a[0]=?,a[1]=? int *ptr=a[0]; a[0]=0 a[1]=0x0efcdab (

文档评论(0)

1亿VIP精品文档

相关文档