0
点赞
收藏
分享

微信扫一扫

【汇编语言与计算机系统结构笔记10】C语言数组的汇编访问:连续存储、代码优化、无边界检查;结构对齐要求 #简洁笔记形式


本次笔记内容:

13.数据的机器表示


注:本次笔记开始,我找到了对应内容的课件,请见​​我于GitHub的CS笔记仓库​​。​因此,为了节省时间,我只记录老师上课强调的内容与对应ppt页码。



本节课对应幻灯片:​​汇编语言程序设计-C语言与汇编​​,第183页起。



文章目录

  • ​​课程流程​​
  • ​​数组访问​​
  • ​​嵌套数组​​
  • ​​Multi-Level Array​​
  • ​​N×N Matrix Code三种情况讨论​​
  • ​​结构 struct​​
  • ​​(结构中)数据存储位置对齐​​
  • ​​结构的存储对齐要求​​
  • ​​结构自身的对齐要求​​
  • ​​结构内元素不同的先后顺序​​


课程流程

数组访问

首先是​​基本数据类型​​​、​​数据的内存存储基本原则​​​、​​数组访问​,“一看便知”,老师没有做讲解。

在第187页,以​​C语言​​声明数组访问代码为例,观察其对应的汇编是怎样的。

在第188页,给了​​数组循环示例(X86-32)​​:从C语言到汇编语言。

在第189页,给了​​指针循环示例(X86-32)​​:即在C中,用指针访问数组元素,其对应汇编语言。

嵌套数组

P190,展示了嵌套数组在内存中的排布。​对于静态数组,在编译时完全了解其在内存中分布,对编译器有利。

P191进行举例,​访问嵌套数组中的“行”​​​,并附有汇编代码。编译器尽量换出 ​​leal​​ 指令进行计算。

P192举例​访问嵌套数组的单个元素​​。

Multi-Level Array

变量​​univ​​是一个指针数组,数组长度为3,数组

元素长度为4字节。每个指针指向一个整数数组。

那么,这三个数组该怎么在内存中分布呢?

【汇编语言与计算机系统结构笔记10】C语言数组的汇编访问:连续存储、代码优化、无边界检查;结构对齐要求 #简洁笔记形式_数据结构

那么,该如何访问呢?

地址计算时,​​Mem[Mem[univ+4*index]+4*dig]​​求取地址值。

  • 首先获得行地址;
  • 再访问改行中元素。

要注意,其​与嵌套访问数组不同。​ 对比可见P195。

N×N Matrix Code三种情况讨论

P196讨论了三种方阵的情况:​​N已知​​​,​​N可变,使用偏移方式访问​​和​​N可变,直接访问(已被gcc支持)​​。

接着,以​​16×16​​​、动态​​n×n​​​矩阵为例,进行举例,有​​C​​​与​​汇编​​代码。

P199给出了一个优化方案的实例:如何取一列?

  • C中使用循环​​i​​​不变,​​j​​为循环变量;
  • 而编译器可以对这个过程进行优化。

同理,P201给出了​​变长矩阵的取列操作​​。与上一个例子原理是相同的。

P202给了一道​​反汇编​​的练习题:本课程中比较强调反汇编的能力。

结构 struct

数组内容结束,进入结构部分P204。

结构就是​​连续分配的内存区域​​,内部元素通过名字访问,且元素可以是不同的数据类型。

课程中所需要讨论的为:​​如何计算结构中元素的地址?​

每个元素在结构中的相对地址在编译时就已确定。

(结构中)数据存储位置对齐

在实际中,不同的数据类型有不同的对齐要求。

因此要讨论对齐的原则、原因、操作等。从P207开始。

对齐的原因是:计算机访问内存一般是以内存块为单位的,块的大小是地址对齐的,如4、8、16字节对齐等。如果数据访问地址跨越“块”边界会引起额外的内存访问。

编译器的工作就是:在结构的各个元素间插入额外空间来满足不同元素的对齐要求。

P208-209展示了x86-64下不同元素的对齐要求。

结构的存储对齐要求

P210:

  • 必须满足结构中各个元素的对齐要求;
  • 结构自身的对齐要求等同于其各个元素中对齐要
    求最高的那个,设为K字节;
  • 结构的起始地址与结构长度必须是K的整数倍。

从P210开始有​​图形示例​​,告诉你“对齐”到底是怎么回事。

大部分情况,为了满足对齐要求,会浪费一些 byte 。

结构自身的对齐要求

P213,结构可能要求自己必须是8过4字节的整数倍。

结构内元素不同的先后顺序

顺序不同,会影响空间利用,因此:​​尽量把double等长类型放在结构前面,以防止前一个小结构为了对齐后一个大结构,而浪费许多空间​​。

P213给了很生动的例子。

自问自答:为什么例子的反例中,要浪费那么多空间?我想,因为内存是分块的。如果​​v​​处于​​p+1​​到​​p+9​​则跨块了,访问时会降低效率,不妥。

之后的内容,如​​结构数组​​​、​​联合​​​和​​练习题​​因为时间原因没有讲,可见ppt。



举报

相关推荐

0 条评论