- 0
- 0
- 约2.12万字
- 约 41页
- 2022-12-21 发布于四川
- 举报
第八章
数组和指针类型的分配和访问
数组的分配和访问
• 数组元素在内存的存放和访问
– 例如,定义一个具有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)