【汇编语言与计算机系统结构笔记10】C语言数组的汇编访问:连续存储、代码优化、无边界检查;结构对齐要求 #简洁笔记形式
2021/6/22 17:29:36
本文主要是介绍【汇编语言与计算机系统结构笔记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字节。每个指针指向一个整数数组。
那么,这三个数组该怎么在内存中分布呢?
那么,该如何访问呢?
在地址计算时,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。
这篇关于【汇编语言与计算机系统结构笔记10】C语言数组的汇编访问:连续存储、代码优化、无边界检查;结构对齐要求 #简洁笔记形式的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-26MATLAB 中 A(7)=[];什么意思?-icode9专业技术文章分享
- 2024-11-26UniApp 中如何实现使用输入法时保持页面列表不动的效果?-icode9专业技术文章分享
- 2024-11-26在 UniApp 中怎么实现输入法弹出时禁止页面向上滚动?-icode9专业技术文章分享
- 2024-11-26WebSocket是什么,怎么使用?-icode9专业技术文章分享
- 2024-11-26页面有多个ref 要动态传入怎么实现?-icode9专业技术文章分享
- 2024-11-26在 UniApp 中实现一个底部输入框的常见方法有哪些?-icode9专业技术文章分享
- 2024-11-26RocketMQ入门指南:搭建与使用全流程详解
- 2024-11-26RocketMQ入门教程:轻松搭建与使用指南
- 2024-11-26手写RocketMQ:从入门到实践的简单教程
- 2024-11-25【机器学习(二)】分类和回归任务-决策树(Decision Tree,DT)算法-Sentosa_DSML社区版