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进行缓冲区溢出攻击,造成远程守护进程溢出并执行代码

相关推荐
ftswsfb1 天前
【系统架构设计师(第2版)】七、系统架构设计基础知识
系统架构
找了一圈尾巴2 天前
架构师备考-架构基本概念
架构·系统架构
白总Server2 天前
OpenHarmony
后端·spring cloud·华为·微服务·ribbon·架构·系统架构
ftswsfb3 天前
【系统架构设计师】六、UML建模与架构文档化
系统架构·uml
程序猿进阶3 天前
系统上云-流量分析和链路分析
java·后端·阿里云·面试·性能优化·系统架构·云计算
ccino .3 天前
企业级邮件系统架构
系统架构
小云小白4 天前
springboot 传统应用程序,适配云原生改造
云原生·系统架构·k8s·springboot
2401_857617626 天前
Spring Boot框架下的信息学科平台系统架构设计
spring boot·后端·系统架构
0_1_bits6 天前
【系统架构】如何演变系统架构:从单体到微服务
微服务·架构·系统架构
后端从入门到精通6 天前
RUP生命周期架构-系统架构师(八十七)
架构·系统架构