CSAPP-程序的机器级表示

文章目录

概念扫盲

1.汇编代码使用文本格式,相较于汇编的二进制可读性更好

2.程序内存包括:可执行的机器代码、操作系统需要的信息、管理过程调用和返回的运行时栈、用户分配的内存块

3.链接器为函数调用找到匹配的可执行代码的位置

4.x86-64中传送指令不能都指向内存位置

5.x86-64中任何寄存器生成的32位值的指令都会把该寄存器的高位设置为0

6.cltq指令将%eax符号扩展到%rax的所有位中

7.乘法指令的参数一个由源操作数给出,一个放在%rdx中。结果存放在%rdx和%rax中

8.有符号除法指令idivl将寄存器%rdx(高64)和%rax(低64)中的128位作为被除数,除数作为指令的操作数给出。商存储在寄存器%rax中,余数存储在%rdx中

9.SIMD(单指令多数据),允许多个操作以并行模式执行

10.指针NULL表示指针没有指向任何地方

11.蠕虫可以自己运行并且将等效副本传播,病毒是添加到操作系统在内的程序中,不能独立运行

12.安全单一化指许多系统容易受到同一种病毒的攻击

13.ASLR(地址空间布局随机化-Address-Space Layout Randomization)每次程序运行时各部分加载到不同区域,可以被穷举攻击(nop sled)

14.canary值,来自金丝雀在矿洞中察觉有毒气体。用于检测栈是否被破坏,即哨兵值

15.所有XMM寄存器都是调用者保存,被调用可以随意覆盖这些寄存器

16.函数参数指针和整数通过寄存器传递,浮点值通过XMM寄存器传递。参数到寄存器的映射取决于类型和排列顺序

思想理解

1.C预处理器扩展源码(include指定文件,扩展define声明的宏),编译器产生汇编,汇编产生目标文件(所有指令的二进制表示,无全局地址),连接器将代码与实现库函数合产生可执行文件

2.反汇编器只是基于机器代码文件中的字节序列来确定汇编代码,不需要访问源代码或者汇编代码

3.x86-64中内存引用总是以四字长的寄存器给出,哪怕只是一字节

4.当switch语句情况数量比较多且范围跨度较小时使用跳转表

5.栈调用通过寄存器最多传递6个整数值,更多参数可以由调用者在自身栈帧存储

6.PC相对寻址是相对本身地址的后面一条指令进行的

7.一个联合的总大小等于它最大字段的大小,将互斥的字段声明为联合可以减少空间的使用

8.奇偶校标志位断最近一次算数逻辑运算产生值的最低位字节是否有偶数个一。在浮点数比较时可以判断是否有操作数是NaN

经典好图

x86规则:生成1字节和2字节的指令保持剩下字节不变,4字节将高位4个字节置0

复杂寻址模式对于数组、结构元素相当有用

不同的数据传送指令的转换关系

set指令集合,jump类似

当前正在执行过程的栈总是在栈顶,返回地址是调用者管理

指针作为参数占8个字节

数组的指针运算

管理变长栈帧,x86-64使用%rbp作为栈指针

浮点体系简介

安全事件

1.1988年著名蠕虫病毒:对finger守护进程fingerd进行缓冲区溢出攻击,造成远程守护进程溢出并执行代码

相关推荐
roman_日积跬步-终至千里5 小时前
【系统架构设计师-综合题(3)】软件工程
系统架构·软件工程
小李的便利店21 小时前
系统架构设计师-案例分析-软件系统设计
系统架构·uml·软件项目管理
踩着两条虫1 天前
AI驱动的 Vue3应用开发平台深入探究(十五):扩展与定制之自定义设置器与属性编辑器
前端·vue.js·人工智能·低代码·系统架构·编辑器
踩着两条虫2 天前
AI驱动的Vue3应用开发平台深入探究(十):物料系统之内置组件库
android·前端·vue.js·人工智能·低代码·系统架构·rxjava
星辰_mya2 天前
InnoDB的“身体结构”:页、Buffer Pool与Redo Log的底层奥秘
数据库·mysql·spring·面试·系统架构
小李的便利店2 天前
系统架构设计师-案例分析-软件架构设计
系统架构·软考·soa·架构风格
zlp19922 天前
软考(系统架构师)-大数据篇
系统架构·软考高级·软考·系统架构师
踩着两条虫2 天前
AI驱动的Vue3应用开发平台 深入探究(十三):物料系统之区块与页面模板
前端·vue.js·人工智能·架构·系统架构
-Da-2 天前
【操作系统学习日记】并发编程中的竞态条件与同步机制:互斥锁与信号量
java·服务器·javascript·数据库·系统架构
roman_日积跬步-终至千里2 天前
【2025下半年系统架构设计师案例分析】电商平台 MySQL + Redis 与缓存击穿治理
mysql·缓存·系统架构