- GitHub计算机系统CSAPP课程资源
- 计算机系统课程 笔记总结 CSAPP第二章 信息的表示和处理(2.1-2.2)
- 计算机系统课程 笔记总结 CSAPP第二章 信息的表示和处理(2.3-2.4)
- 计算机系统课程 笔记总结 CSAPP第三章 程序的机器级表示(3.2-3.4)
- 计算机系统课程 笔记总结 CSAPP第三章 程序的机器级表示(3.5-3.7)
- 计算机系统课程 笔记总结 CSAPP第三章 程序的机器级表示(3.8-3.10)
- 计算机系统课程 笔记总结 CSAPP第四章 处理器体系结构(4.1-4.3)
- 计算机系统课程 笔记总结 CSAPP第五章 优化程序性能(5.1-5.14)
- 计算机系统课程 笔记总结 CSAPP第六章 存储器层次结构(6.2-6.6)
- 计算机系统课程 笔记总结 CSAPP第七章 链接(7.1-7.13)
- 计算机系统课程 笔记总结 CSAPP第八章 异常控制流(8.0-8.1)
- 计算机系统课程 笔记总结 CSAPP第八章 异常控制流(8.2-8.4)
- 计算机系统课程 笔记总结 CSAPP第九章 虚拟存储器(9.1-9.5)
- 计算机系统课程 笔记总结 CSAPP第九章 虚拟存储器(9.6-9.10)
目录
3.5 算术和逻辑操作
指令操作分为4组:
|
|||
每种指令操作各有针对 b/w/l/q 的操作 |
|||
3.5.1 加载有效地址 lea
加载有效地址(load effective address,LEA)指令
- 类似于MOV,是MOV指令的变形
- 从内存读数据到寄存器,没有引用内存(存储器)
- 不是从指定的位置读入数据,而是将有效地址写入到目的操作数
- 常用用途
- C语言中‘&’操作,指针,取地址
- 算术操作:若%rdx的值为x,leaq 7(%rdx,%rdx,4), %rax 将%rax的值设置为5*x+7
3.5.2 一元和二元操作
一元操作:inc、dec、neg、not
- inc D 加1
- dec D 减1
- neg D 取负
- not D 取补
- 只有一个操作数,既是源又是目的,可以是寄存器或存储器
二元操作:add、sub、imul、xor、or、and
- add S,D D <-- D+S 加
- sub S,D D <-- D-S 减
- imul S,D D <-- D*S 乘
- xor S,D D <-- D^S 异或
- or S,D D <-- D|S 或
- and S,D D <-- D&S 与
- 第一个操作数可以任意,第二个操作数可以是寄存器或存储器位置,且两个操作数不能同时是存储器位置
- 第二个操作数既是源又是目的,可以联想到C语言的x+=y
3.5.3 移位操作 sal、shl、sar、shr
|
|||
例如:8位二进制数11001101分别右移一位。
|
|||
3.5.3 特殊的算术操作
3.6 控制
- 条件语句 if
- 循环语句 for
- 分支语句 switch
3.6.1 条件码
条件码(condition code)寄存器,描述了最近的算术或逻辑操作的属性,可以检测这些寄存器来执行条件分支指令。
- CF:进位标志——检查无符号操作的溢出
- ZF:零标志——最近操作结果为0
- SF:符号标志——最近操作结果为负数
- OF:溢出标志——导致一个补码溢出,正溢出或负溢出
其中,leaq操作不会改变条件码,因为leaq是操作地址
|
|||
3.6.2 访问条件码
条件码通常不会直接读取,常用的使用方法有3种
- 可以根据条件码的某种组合,将一个字节设置为0或1
- 可以条件跳转到程序的某个其他部分
- 可以有条件地传送数据
SET指令:根据条件码的某种组合,将一个字节设置为0或1
e:euqal z:zero s:sign 有符号-->负数 |
|||||
n:not l:lower e:equal g:greater |
|||||
a:above b:below e:equal |
|||||
3.6.3 跳转指令
je: jump if equal n:not |
||||
n:not l:lower e:equal g:greater a:above b:below e:equal |
||||
3.6.5 用条件控制来实现条件分支
int absdiff(int x, int y){ |
movl 8(%ebp),%edx 获取x |
||||
C语言代码将被编译为如下汇编代码:
|
|||||
3.6.6 用条件控制来实现条件分支
|
|||
优化 |
|||
int absdiff(int x,int y){ |
movl 8(%ebp),%ecx 获取x |
||||||
类似于下面代码 |
|||||||
int tval = y-x; // 只需一条指令 return rval; |
|||||||
使用 x < y ? x : y 更为高效 |
|||||||
3.6.7 循环
大多数汇编器会根据一个循环的do-while形式来产生循环代码,其他的循环会首先转换成do-while形式,再编译成机器代码。
3.6.7 switch语句
3.7 过程
假设过程P调用过程Q,Q执行后返回到P。这些动作包括下面一个或多个机制:
- 传递控制。再进入过程Q的时候,程序计数器必须被设置为Q的代码的起始地址,然后在返回时,要把程序计数器设置为P中调用Q后面那条指令的地址。
- 传递数据。P必须能够向Q提供一个或多个参数,Q必须能够向P返回一个值。
- 分配或释放内存。在开始时,Q可能需要为局部变量分配空间,而在返回前,又必须释放这些存储空间。
3.7.1 运行时栈
- 机器用栈来传递参数、存储返回信息、保存寄存器用于以后恢复以及本地存储等。
- 为单个过程分配的那部分栈称为栈帧(stack frame)。
- 栈帧以两个指针界定,寄存器%ebp为帧指针,寄存器%esp为栈指针,当程序执行时,栈指针可以移动,因此大多数信息的访问都是相对于帧指针(即帧指针为当前栈帧的固定起点)的。
[栈底] |
|||||
假设过程P调用过程Q,则Q的参数放在P的栈帧中,P中的返回地址被压入栈中,形成P的栈帧的末尾。返回地址就是当程序从Q返回时应该继续执行的地方。过程Q也用栈来保存其他不能存放在寄存器中的局部变量,以及Q调用的其他过程的参数。 |
|||||
3.7.2 转移控制
注:
|
|||
call和ret指令
- call指令会把地址A(称为“返回地址”)压入栈中,并将PC设置为设置为Q的起始地址。
- 返回地址A是紧跟在call指令后面那条指令的地址。
- 对应的指令ret会从栈中弹出地址A,并将PC设置为A。
3.7.3 数据传送
- 参数
- x86-64中,可以通过寄存器最多传递6个整型(例如整数和指针)参数。
- 会根据参数在参数列表中的顺序为它们分配寄存器。
- 可以通过64位寄存器适当的部分访问小于64位的参数。
- 例如,如果第一个参数是32位的,那么可以用%edi来访问它。
- 返回值
- 当Q返回到P时,P的代码可以访问寄存器%rax中的返回值。
3.7.4 栈上的局部存储
局部数据必须存放在内存中,常见情况包括:
- 寄存器不足够存放所有的本地数据
- 对于一个局部变量使用地址运算符‘&’,因此必须能够为它产生一个地址
- 某些局部变量是数组或结构,因此必须能够为它产生一个地址
- 一般来说,过程通过减小栈指针在栈上分配空间。
- 分配的结果作为栈帧的一部分,标号为“局部变量”。
|
|||||||
|
|||||||
运行时,栈提供了一种
- 简单的
- 在需要时分配的
- 函数完成时释放的
局部存储的机制。
3.7.5 寄存器中的局部存储空间
寄存器组是唯一被所有过程共享的资源。根据惯例:
- 被调用者保存寄存器
- %rbx、%rbp和%r12~%r15
- 当过程P调用过程Q时,Q必须保存这些寄存器的值,并保证它们的值在Q返回到P时与Q被调用时是一样的
- 使用:
- 不去改变寄存器的值
- 原始值压入栈中,改变寄存器的值,然后在返回之前从栈中弹出旧值
- 调用者保存寄存器
- 除了%rsp的其它寄存器
- 任何函数都能修改
- 如何理解“调用者保存”:
- 过程P在某个调用者保存寄存器中有局部数据,然后调用过程Q;因为Q可以随意修改这个寄存器,所以在调用之前首先保存好这个数据是P(调用者)的责任。
3.7.6 递归过程
%rax保存递归返回值 同时用做当前函数返回值 |
|||||
- 计算机系统课程 笔记总结 CSAPP第二章 信息的表示和处理(2.1-2.2)
- 计算机系统课程 笔记总结 CSAPP第二章 信息的表示和处理(2.3-2.4)
- 计算机系统课程 笔记总结 CSAPP第三章 程序的机器级表示(3.2-3.4)
- 计算机系统课程 笔记总结 CSAPP第三章 程序的机器级表示(3.5-3.7)
- 计算机系统课程 笔记总结 CSAPP第三章 程序的机器级表示(3.8-3.10)
- 计算机系统课程 笔记总结 CSAPP第四章 处理器体系结构(4.1-4.3)
- 计算机系统课程 笔记总结 CSAPP第五章 优化程序性能(5.1-5.14)
- 计算机系统课程 笔记总结 CSAPP第六章 存储器层次结构(6.2-6.6)
- 计算机系统课程 笔记总结 CSAPP第七章 链接(7.1-7.13)
- 计算机系统课程 笔记总结 CSAPP第八章 异常控制流(8.0-8.1)
- 计算机系统课程 笔记总结 CSAPP第八章 异常控制流(8.2-8.4)
- 计算机系统课程 笔记总结 CSAPP第九章 虚拟存储器(9.1-9.5)
- 计算机系统课程 笔记总结 CSAPP第九章 虚拟存储器(9.6-9.10)
- GitHub计算机系统CSAPP课程资源