本次笔记内容:
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+1p+9则跨块了,访问时会降低效率,不妥。

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

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

  1. 【汇编语言与计算机系统结构笔记01】x86/MIPS/ARM指令集概述与特性,一篇HPCA引发的思考(商业生态的决定性作用)

    资源Bilibili AV46914471 + AV57921488 汇编语言与计算机系统结构 清华大学 张悠慧 本次笔记内容: 01.汇编语言与计算机系统结构 02.汇编基础知识--指令集综述 文章 ...

  2. 【汇编语言与计算机系统结构笔记05】汇编的系统结构,从C代码生产汇编代码,一个具体的、经典的数据传送指令(mov)实例与分析

    本次笔记内容: 06.寻址模式与数据传输指令等 文章目录 汇编程序员眼中的系统结构 如何从C代码生产汇编代码 如何装gcc? 汇编语言数据格式 第一条汇编指令实例 数据传送指令(mov) 语法与操作数 ...

  3. 【汇编语言与计算机系统结构笔记03】浮点数的计算机表示,IEEE 754,舍入(rounding),C语言中的浮点数

    本次笔记内容: 04.浮点数的计算机表示 文章目录 IEEE的浮点数标准 IEEE的754标准 浮点数示例 计算机中浮点数二进制表示 浮点数的类型 规格化浮点数(Normalized) 规格化浮点数示 ...

  4. 【汇编语言与计算机系统结构笔记12】序格式与伪操作:简化段的定义、操作符等

    本次笔记内容: 15.程序格式与伪操作-2 16.上机过程-1(前15分钟) 注:我找到了对应内容的课件,请见我于GitHub的CS笔记仓库.因此,为了节省时间,我只记录老师上课强调的内容与对应ppt ...

  5. 【汇编语言与计算机系统结构笔记02】整数的计算机表示与运算,C中的无符号字符(unsigned)和带符号字符(signed),补码,一些例题

    本次笔记内容: 03.整数的计算机表示与运算 文章目录 预备知识 数制 数的机器表示 机器字在内存中的组织 字节序(Byte Ordering) 整数表示 计算机中整数的二进制编码方式 无符号数与带符 ...

  6. 【汇编语言与计算机系统结构笔记20】补充内容:可定制处理器指令集

    本次笔记内容: 31.补充内容--可定制处理器指令集-1 32.补充内容--可定制处理器指令集-2 注:我找到了对应内容的课件,请见我于GitHub的CS笔记仓库. 本节课对应幻灯片:汇编语言程序设计 ...

  7. 【汇编语言与计算机系统结构笔记17】MIPS 汇编初步

    本次笔记内容: 25.MIPS汇编初步-1 26.MIPS汇编初步-2 27.MIPS指令集与汇编程序设计 注:我找到了对应内容的课件,请见我于GitHub的CS笔记仓库.因此,为了节省时间,我只记录 ...

  8. 【汇编语言与计算机系统结构笔记11】程序格式与伪操作:段定义、堆栈 #简洁笔记形式

    本次笔记内容: 14.程序格式与伪操作-1 注:本节课更换为一名女老师.我找到了对应内容的课件,请见我于GitHub的CS笔记仓库.因此,为了节省时间,我只记录老师上课强调的内容与对应ppt页码. 注 ...

  9. 【汇编语言与计算机系统结构笔记07】条件码,比较、测试、条件跳转与条件转移指令,结合微体系结构与流水的说明

    本次笔记内容: 08.控制流-1 文章目录 条件码 基于add的CF, ZF, SF, OF 比较(Compare)指令 测试(Test)指令 读取条件码(SetX)指令 例子 拓展:流水设计与微体系 ...

最新文章

  1. 微盟创始人孙涛勇回应员工删库;字节跳动推“头条搜索”独立 App;C++ 20 规范完成| 极客头条...
  2. window平台下 Eclipse Ndk开发中的Method 'NewStringUTF' could not be resolved问题
  3. python函数后面有多个括号怎么理解?
  4. ubuntu12.04配置双显示器
  5. 让Python中类的属性具有惰性求值的能力
  6. 达内php吾爱_2018年达内c++全套视频课程(不加密)
  7. [资源]基于 Pytorch 的 TorchGAN开源了!
  8. python文件读写方法手机_python读取文件—txt文件常用读写操作
  9. Flutter CupertinoSlidingSegmentedControl 分段组件使用解析
  10. laravel插入数据时报 502 Bad Gateway
  11. aws服务器修改root密码,使用Xshell登录AWS EC2服务器设置root+密码方式登录
  12. 前端,html,css,js,vue
  13. 比Kafka Mangaer更优秀的开源监控工具-Kafka Eagle
  14. kali流量转发后依然断网_虚拟运营商流量卡列表
  15. 【软件工程】--设计阶段
  16. 疯狂圣诞夜,带你探寻那些吃喝玩乐的好去处……
  17. Flyway学习和使用
  18. Python学习:Python分析钉钉评论(一)爬取数据
  19. 【IDEA启动报错】Failed to load JVM DLL..jre\bin\jvm.dll,If you already have 32-bit JDK installed
  20. odoo14 | 视图报错:没有找到模型:xxx

热门文章

  1. sqlserver数据导入hdfs和hive的解决方案
  2. 【UE4游戏开发】安装UE4时报SU-PQR1603错误的解决方法
  3. 如何恢复初始git提交?
  4. 线程池类似于多处理池?
  5. 使用内容脚本将代码插入页面上下文
  6. centos7安装源疯了_Jenkins 在 Centos7 上安装(使用国内源)
  7. win10开机显示拒绝访问怎么办
  8. c++ 函数当参数传参,类函数当参数传参,匿名函数当参数传参,function<void()>
  9. Makefile:Makefile中的调试打印方法
  10. STM32F103mini教程学习总结与心得(一)