1、Intel现在称其指令集为IA32,即Intel 32位体系结构(Intel Architecture 32-bit),这个处理器也俗称为“x86”。

2、Linux使用了平面寻址方式(flat addressing),在这种寻址方式中,程序员将整个存储空间看做一个大的字节数组。

3、在平面寻址中,对特殊寄存器的需求已经大为降低了。在大多数情况下,前六个寄存器都可以看作是通用寄存器,对它们使用的没有限制。

4、对于C语言中比如if表示式,switch,while,for循环等对应的汇编表示,在本书都有详细描述,对于研究汇编写程序有极大帮助。此略。

5、一个过程调用包括将数据(以过程参数和返回值的形式)和控制从代码的一部分传递到另一部分。数据传递、局部变量的分配和释放是通过操纵程序栈来实现的。

6、IA32程序用程序栈来支持过程调用。栈用来传递过程参数、存储返回信息、保存寄存器以供以后恢复之用,以及用于本地存储。为单个过程分配的那部分栈称为栈帧(stack frame)。栈帧的最顶端是以两个指针定界的,寄存器%ebp作为帧指针,而寄存器%esp作为栈指针。

7、程序寄存器组是惟一一个被所有过程共享的资源。我们必须保证当一个过程(调用者)调用另一个(被调用者)时,被调用者不会覆盖某个调用者稍后会使用的寄存器的值。为些,IA32采用于一组统一的寄存器使用惯例:寄存器eax,edx,ecx被分为调用者保存寄存器,当过程P调用Q时,Q可以覆盖这些寄存器,而不会破坏任何P所需要的数据。另外,ebx,esi,edi分为被调用者保存寄存器,意味着覆盖他们之前,将这些寄存器的值保存在栈中,并在返回前恢复他们。

8、在大多数现代处理器模型中,乘法指令只需要3个时钟周期。

9、结构的实现类似于数组的实现,因为结构的所有组成部分都存放在存储器中连续的区域内,而指向结构的指针就是结构第一个字节的地址。

10、对齐

许多计算机系统对基本数据类型的可允许地址做出了一些限制,要求某种类型的对象的地址必须是某个值k(通常是2,4,或8)的倍数。

Linux沿用的对齐策略是:2字节数据类型(e.g short)的地址必须是2的倍数,而较大的数据类型(e.g int,int*,float,double)的地址必须是4的倍数。这意味着一个short类型对象的地址的最低位必须等于0。类似地,任何int类型的对象或指针的地址最低两位必须都是0。

Microsoft windows的对齐策略为:任何k字节对象的地址都必须是k的倍数;特别地,要求一个double的地址应该是8的倍数。

分配存储器的例程(如malloc)的设计必须使得它们返回的指针能满足最糟糕的对齐限制,通常是4或者是8。

结构体的对齐策略,考虑到分配结构体数组,要求其大小是结构体中最大字节类型的整数倍。

11、存储器越界问题

示例代码

/* Implementation of library function gets() */
char* gets(char *s)
{int c;char *dest = s;while ((c = getchar()) !=  '\n' && c != EOF)*dest++ = c;*dest++ = '\0'; /* Terminate String */if (c == EOF)return NULL;return s;
}/* Read input line and write it back */void echo(){char buf[4]; /* Way too small! */gets(buf);puts(buf);}

缓冲区溢出的一个更加致命的使用就是让程序执行它本身不愿意执行的函数。通常,输入给程序一个字符串,这个字符串包含一些可执行代码的字节编码,称为expliot code,另外,还有一些字节会用一个指向缓冲区中那些可执行代码的指针覆盖掉返回指针,所以执行ret指令的效果就是跳转到expliot code(plus some extra bytes that overwrite the return pointer with a pointer to the code in the buffer. The effect of executing the ret instruction is then to jump to the exploit code)。

在一种攻击形式中,expliot code会使用系统调用启动一个shell程序,提供给攻击者一组操作系统的函数(providing the attacker with a range of operating system functions.)。另一种攻击形式中,expliot code会执行一些未授权的任务,修复对栈的破坏,然后第二次执行ret指令(看上去好像)正常返回给调用者。(the exploit code performs some otherwise unauthorized task, repairs the damage to the stack, and then executes ret a second time, causing an (apparently) normal return to the caller.)。

12、蠕虫(worm)是这样一个程序,它可以自己运行,并且能够将一个完全有效的自己传播到其他机器。病毒(virus)是这样一段代码,它能将自己添加到包括操作系统在内的其他程序中,但它不能独立运行。

13、浮点运算单元(FPU),IA32浮点寄存器的宽都是80位。浮点运算器的行为可能依赖于值是保存在寄存器中,还是存储器中。

<Computer Systems:A Programmer's Perspective>

3、深入理解计算机系统笔记:程序的机器级表示相关推荐

  1. 【《深入理解计算机系统》读书笔记(3)】 第3章 程序的机器级表示

    [时间]2021.11.19 [题目]<深入理解计算机系统>读书笔记(3)  第3章 程序的机器级表示 目录 一.简介 二.一些重点图 1.常见数据类型格式 2.16个整数寄存器 3.寄存 ...

  2. 计算机系统导论第九章,计算机系统导论 -- 读书笔记 -- 第三章 程序的机器级表示 (持续更新)...

    计算机系统导论 -- 读书笔记 -- 第三章 程序的机器级表示 (持续更新) 第三章 程序的机器级表示 3.1 历史观点 3.2 程序编码 1. 命令行 (1)编译 Linux> gcc -Og ...

  3. 深入理解计算机系统_第三章_程序的机器级表示

    深入,并且广泛-沉默犀牛 文章目录 文章导读 历史观点 程序编码 机器级代码 代码示例 关于格式的注解 数据格式 访问信息 操作数指示符 数据传送指令 数据传送示例 压入和弹出栈数据 算术和逻辑操作 ...

  4. 深入理解计算机系统 第3章 程序的机器级表示

    目录 第3章 程序的机器级表示 数据格式 操作数指示符 练习题 数据传送指令 习题3.4 访问信息 压入和弹出栈数据 算数和逻辑操作 移位操作 讨论 特殊的算数操作 问题 第3章 程序的机器级表示 数 ...

  5. bilibili深入理解计算机系统笔记(1):汇编模拟器能跑了

    文章目录 深入理解计算机系统笔记 P1笔记 p2笔记 p3笔记 p4笔记 汇编模拟器(p5-7) 封装访存接口 输出计算机状态 实现指令 call指令的实现 bug 积累 include重复包含的bu ...

  6. bilibili深入理解计算机系统笔记(2):第一次代码重构,汇编模拟器,递归,指令周期实现。

    文章目录 深入理解计算机系统笔记(2) 第一次代码重构 可变参数输出print函数 bitmap学习 P10 有限自动机 指令周期 递归求和函数c语言和汇编语言 回调函数的实现 call和ret指令的 ...

  7. 【计算机系统基础4】程序的机器级表示

    [计算机系统基础4]程序的机器级表示 4.程序的机器级表示 4.1(:school: CMU补充 )x86-64 Linux 寄存器使用 4.2传送指令 4.2.1`mov` 指令 4.2.2 `mo ...

  8. 第三章 程序的机器级表示

    程序的机器级表示 计算机执行机器代码,用字节序列编码低级的操作,包括处理数据.管理内存.读写存储设备上的数据,以及利用网络通信.编译器基于编程语言的规则.目标机器的指令集和操作系统遵循的惯例,经过一系 ...

  9. 第 3 章 程序的机器级表示

    文章目录 第 3 章 程序的机器级表示 3.1 历史观点 3.2 程序编码 3.2.1 机器级代码 3.2.2 代码示例 3.2.3 关于格式的注解 3.3 数据格式 3.4 访问信息 3.4.1 操 ...

  10. 第三章程序的机器级表示

    原地址:https://www.cnblogs.com/disturbia/p/4869229.html 第三章 程序的机器级表示 3.1 历史观点 Intel处理器系列俗称x86,开始时是第一代单芯 ...

最新文章

  1. 浅谈TCP的窗口字段
  2. python十三:函数
  3. mysql 表名不加单引号_当表名“ match”没有用单引号引起来时,MySQL引发错误?...
  4. 张家口张北:加速“云计算”产业集聚
  5. FreeMarker中文API手册(完整)
  6. Java 异常 总结 try catch finally Exception
  7. (3.1)HarmonyOS鸿蒙单击事件4种写法
  8. html边框自动变颜色,css怎么设置边框颜色?
  9. 二进制数据结构:JavaScript中的树和堆简介
  10. 4-26 pixel赋值问题 mbcmp函数 宏定义
  11. protobuf与protoc
  12. AD学习问题记录(三):AD21版本如何重新定义板子形状
  13. 2017吉比特校招一个编程笔试题
  14. 华硕k43tk拆机清灰教程
  15. 终身受用的十大经典理论
  16. 漫谈程序员系列:请区别对待女程序员
  17. 科大奥锐干涉法测微小量实验的数据,大学物理实验教材课后思考题答案 (4)
  18. java实现逻辑推断
  19. 业务应用数据库压力过大解决方案
  20. C语言中的清屏函数(自己编写)

热门文章

  1. php基础:switch cass控制结构 代替if
  2. Struts的ONGL
  3. Linux下的一个图形管理工具webmin
  4. 【Extjs】 checkboxmodel 中事件处理
  5. 1202: [HNOI2005]狡猾的商人
  6. CDH 5 Maven Repository
  7. Linux主机驱动与外设驱动分离思想
  8. 插入blob字段的简单方法
  9. [Gitlab]使用Webhook实现前端项目自动发布
  10. 利用jsoncpp将json字符串转换为Vector