深入理解计算机系统——第三章—3.8数组分配和访问

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_40199047/article/details/102672329

3.8 数组分配和访问

C语言的数组是一种将标量数据聚集成更大数据类型的方式

3.8.1 基本原则

对于数据类型 T 和整型常数 N,声明如下:
T A[N]
示例:
这里写图片描述
数组A12个单字节(char)元素组成。
数组C6个整数组成,每个需要8个字节。
BD都是指针指数,因此每个数组元素都是8个字节。

示例:

int E[i];
假设 E 的地址在 %rdx中
i 存放在 %rcx 中,有
movl	 (%rdx, %rcx, 4),  %eax

即,地址计算了 X E + 4 i X_E + 4i ,并将读取的值存入 %eax中。

3.8.2 指针运算

C语言允许对指针进行运算,而计算出来的值会根据该指针引用的数据类型的大小进行伸缩。
单操作数操作符&* 可以产生指针和间接引用指针。
这里写图片描述

3.8.3 嵌套的数组

当我们创建数组的数组时,数组分配和引用的一般原则也是成立的。例如:
int A[5][3]
等价于
typedef int row3_t[3]; row3_t A[5];
公式一:
这里写图片描述
L是数据类型T以字节为单位的大小。
示例:
假设A[5][3]

A in %rdi, i in %rsi, j in %rdx

leaq	(%rsi, %rsi, 2), %rax  //Compute 3i
leaq	(%rdi, %rax, 4), %rax  //Compute xA+12i
movl	(%rax, %rdx, 4), %eax  //Read from M[xA+4(3i+j)]

这里写图片描述
示例:
这里写图片描述

3.8.4 定长数组

C语言编译器能够优化定长多为数组上的操作代码。
假设定义如下数组:

#define N 16 
typedef int fix_matrix[N][N];

示例:
这里写图片描述

3.8.5 变长数组

假设变长数组的声明如下:
int A[expr1][expr2]
它可以作为一个局部变量,也可以作为一个函数的参数;通常对表达式expr1expr2求值来确定数组的维度。例如访问 n x n数组的元素 ij ,可以写如下函数:

int var_ele(long n, int A[n][n], long i, long j){
    return A[i][j];
}

参数 n 必须在参数 A[n][n] 之前。
如下代码,计算两个 *n x n * 矩阵 AB 乘积的元素 ik
这里写图片描述
汇编代码如下

Registers: n in %rdi, Arow in %rsi, Bptr in %rcx
           4n in %r9, result in %eax, j in %edx
.L24:
     movl,   (%rsi, %rdx, 4), %r8d    ;Read Arow[j]
     imull   (%rcx), %r8d             ;Multiply by *Bptr
     addl    %r8d, %eax               ;Add to result
     addq    $1, %rdx                 ;j++
     addq    %r9, %rcx                ;Bptr += n
     cmpq    %rdi, %rcx               ;Compare j:n
     jne     .L24

猜你喜欢

转载自blog.csdn.net/weixin_40199047/article/details/102672329
今日推荐