计算机系统概述
图灵机模型:从一个状态到另一个状态的状态转换关系。(理论方面无突破)
实现:冯诺依曼体系结构——“存储程序”的思想确立了现代计算机的结构。
通用寄存器组:AX,BX,CX,DX,SP,BP,DI,SI
AX(Accumulator Register):累加器寄存器通常用于执行各种算术和逻辑操作。
BX(Base Register):基址寄存器通常用于存储内存访问中的基地址或偏移地址。
CX(Count Register):计数寄存器执行各种操作,包括循环控制,字符串操作,移位和轮换和其他通用任务。
DX(DataRegister):数据寄存器常用于数据传递。在寄存器间接寻址中的I/O指令中存放I/O端口的地址。
SP(Stack Pointer):栈指针用于跟踪程序运行时的堆栈(stack)操作。
BP(Base Pointer):基址指针用于栈帧(stack frame)的操作和数据访问。
DI(Destination Index Register):目的索引寄存器用于执行字符串和数据传输操作。
SI(Source Index Register):源索引寄存器用于执行字符串和数据传输操作。
- 寄存器标识符
数字 | 寄存器 | 数字 | 寄存器 |
---|---|---|---|
0 | %rax | 8 | %r8 |
1 | %rcx | 9 | %r9 |
2 | %rdx | A | %r10 |
3 | %rbx | B | %r11 |
4 | %rsp | C | %r12 |
5 | %rbp | D | %r13 |
6 | %rsi | E | %r14 |
7 | %rdi | F | 无寄存器 |
专用寄存器组:CS,DS,SS,ES,IP+内部寄存器
CS(Code Segment Register):代码段寄存器用于存储当前执行代码的段基址,也就是指向程序的代码段在内存中的起始地址。
DS(Data Segment Register):数据段寄存器用于存储当前执行程序的数据段的基址,主要作用是在程序执行期间确定数据访问的内存段。
SS(Stack Segment Register):堆栈段寄存器用于存储当前堆栈的段基址。
ES(Extra Segment Register):额外段寄存器用于存储附加的数据段的段基址。
附加数据段:ES 寄存器存储了一个数据段的段基址,该段通常用于字符串操作、数据传输和其他与数据相关的操作。这个数据段可以是程序中的任何数据段,具体用途取决于程序设计。
IP(Instruction Pointer):是一个寄存器或专用寄存器,用于存储正在执行的程序的下一条指令的地址。
条件码
OF:有符号数溢出的标志。
CF:无符号数溢出的标志。
IF(Interrupt Flag):在x86体系结构中,IF 指的是中断标志寄存器,用于启用或禁用中断。当 IF 位被置位(设置为1)时,允许中断响应,而当被清零(设置为0)时,禁用中断。
SF(Sign Flag):SF引入数的最高位,通常是运算结果中的最高位(最左边的位)。如果最高位为1,表示结果为负数,SF标志将被设置为1;如果最高位为0,表示结果为正数,SF标志将被清零。
ZF(Zero Flag):当某个操作的结果等于零时,ZF 标志被设置为1,表示为真(true)。当结果不为零时,ZF 标志被清零,表示为假(false)。
补码:正数最高位为0,负数最高位为1。
采取补码的原因:
- 符号一致性:补码表示法统一了正数和负数的表示方式,无需特殊处理符号位。这使得计算机硬件和软件更加简化,因为加法和减法可以以相同的方式执行,而不必担心符号。
- 唯一零表示:在补码中,零的表示方式是唯一的,即所有位都为0。这消除了正零和负零之间的歧义,使零的比较和操作更加一致。
- 容易执行加法和减法:补码使加法和减法的实现更加简单,因为它们可以使用相同的硬件逻辑来执行。减法操作可以等效为加法操作,从而简化了处理器设计。
- 容易检测溢出:在补码中,溢出的检测变得相对容易,因为溢出会导致最高位的进位或借位。这有助于确保数字运算的正确性。
- 数学一致性:补码与模运算和其他数学操作更加一致,使得数学运算更容易理解和分析。
- 节省硬件成本:相对于其他表示方法(如原码),补码的硬件逻辑较为简单,因此可以降低硬件成本和复杂度。
只有有符号数相减得到正确答案
硬件不判断乘法是否溢出,而是保留2n位。
u < < << << k = = == == u ∗ * ∗ 2 k 2^k 2k
无符号数除法采用逻辑右移方式,带符号整数采用算术右移方式
能整除时,直接右移得到结果,不能整除时,商采用朝零方向舍入的方式,也就是截断方式,即:移出的低位数直接丢弃。(带符号负整数不对,需要加偏移量
2
k
−
1
2^k-1
2k−1,然后再右移
k
k
k位,低位截断)
Software
系统软件
——简化编程过程,并使硬件资源被有效利用
操作系统:硬件资源管理,用户接口
处理器调动,内存管理,I/O管理,人机交互
语言处理系统:翻译程序+Linker,Debug,etc…
翻译程序:
汇编程序:汇编语言源程序->机器语言目标程序
编译程序:高级语言源程序->机器级目标程序
解释程序:将高级语言语句逐句翻译成机器指令并立刻执行,并立即执行,不生成目标文件。
其他实用程序
硬盘碎片整理程序、备份程序等
应用软件
——解决具体应用问题/完成具体应用任务
数据的表示和运算
计算机的核心操作:存储,运算,传输
1字节=8位
正数 | 原码 | 反码 | 补码 |
---|---|---|---|
负数 | 最高位为1 | 按位取反 | 反码+1 |
字长:数据通路的宽度=CPU内部总线的宽度,运算器的位数,通用寄存器的宽度
字:x86字长16位,现在为32位。
Alignment(对齐):要求数据的地址是相应的边界地址
不按边界对齐可能会增加访问次数
信息的表示和处理
signed -> unsigned U2T
unsigned -> signed T2U
TMin -> 当取最小值
⊙ \odot ⊙ 位级整数编码规则
假设
- 整数用补码的形式表示。
- 有符号数的右移是算术右移。
- 数据类型 int 是 w 位长的。对于某些题目,会给定 w 的值,但是在其他情况下,只要 w 是 8 的整数倍,你的代码就应该能正常工作。你可以用表达式 sizeof(int)<<3 来计算 w。
禁止使用 - 条件语句( if 或者 ?: )、循环、分支语句、函数调用和宏调用。
- 除法、模运算和乘法。
- 相对比较运算(<、>、<= 和 >=)。
允许的运算 - 所有位级和逻辑运算
- 左移和右移,但是位移量只能在 0 和 w-1 之间。
- 加法和减法。
- 相等 ( = = == ==)和不相等( ! = != !=)的测试。(有些题目中,也不允许这样的运算)。
- 整型常数 INT_MAX 和 INT_MIN。
- 对 int 和 unsigned 进行强制类型转换,不论是显式还是隐式的。
程序的机器级表示
-O2:告诉编译器使用第二级优化
通常,提高优化级别会使最终程序运行得更快,但编译时间会变长,对代码进行调试会更困难,第二级优化是性能优化和使用方便之间的一种很好的妥协
-S:使编译器产生一个汇编文件X.s,但不做其他进一步的工作
-c:产生目标代码文件X.o,它是二进制格式的。
-d:在Linux系统中,根据目标代码生成一种类似汇编代码的格式。
%eip:程序计数器表示将要执行的下一条指令在存储器中的地址
程序存储器是用虚拟地址来寻址的,操作系统负责管理虚拟地址空间,将虚拟地址转换成实际处理器存储器中的物理地址。
反汇编器只是根据目标文件中的字节序列来确定汇编代码的,它不需要访问程序的源码和汇编代码。
间接引用指针就是将该指针放在一个寄存器中,然后再间接存储器引用中使用这个寄存器。
机器指令
[[计算机系统基础#通用寄存器组:AX,BX,CX,DX,SP,BP,DI,SI]]
pushl:将寄存器中的内容压入程序栈中。
popl:将数据从栈中弹出。
nop:no operation,为了填充存储该过程的空间。
mov:传送数据
将一个值从一个存储器位置拷到另一个存储器位置需要两条指令——第一条将源值加载到寄存器中,第二条将该寄存器值写入目的位置。
movl 8(%ebp), %edi:将参数存储再相对于寄存器%ebp中地址值的偏移8的地方。
movb:传送字节;movw:传送字;movl:传送双字;movsbl S,D:传送符号扩展的字节;movzbl S,D:传送零扩展的字节。
leal:movl的变形,加载有效地址。
cmpl:比较双字
设置条件码但不改变寄存器
testl:测试双字
整数算术操作
subl $4 , %esp:将%esp减4。
addl $4 , %esp:将%esp加4。
imull S,D:D<- D ∗ * ∗S :乘。
xoral S,D:D<- D^S:异或。
orl S,D:D<- D|S:或。
andl S,D:D<- D&S:和。
**incl D**:D<- D+1:加1。
decl D:D<- D-1:减1。
negl D:D<- -D:取负。
notl D:D<- ~D:取补。
**sall k,D**:D<- D<
shll k,D:D<- D<<k:左移。
sarl k,D:D<- D>>k:算术右移。(填上符号位)
shrl k,D:D<- D>>k:逻辑右移。(填上0)
特殊的算术操作
将
x
x
x和
y
y
y的全
64
64
64位乘积作为
8
8
8个字节存放在栈顶
x
x
x在%
e
b
p
ebp
ebp+
8
8
8,
y
y
y在%
e
b
p
ebp
ebp+
12
12
12
movl 8(%ebp),%eax //Put x in %eax
imull 12(%ebp) //Multiply by y
pushl %edx //Push high-order 32 bits
pushl %eax //Push low-order 32 bits
操作数指示符
1.立即数
常数值,书写方式为 后面 + 一个整数,任何 32 位的字都可以用作立即数例如 后面+一个整数,任何32位的字都可以用作立即数 例如 后面+一个整数,任何32位的字都可以用作立即数例如-577
2.寄存器
表示某个寄存器的内容,对双字操作,可能是8个32位寄存器中的一个(%eax),对字节操作来说,可以是8个单字节寄存器元素中的一个(%al)。
3.存储器引用
根据计算出来的有效地址访问某个存储位置,因此将存储器看成一个很大的字节数组。
汇编语言习惯用法
xorl %edx, %edx ;将寄存器%edx设置为0。
- 注释:在汇编语言中,注释是非常重要的,它们用于解释代码的目的和功能。通常,注释使用分号(;)或特定的注释指令来添加。例如,在x86汇编中,注释可以使用";"添加。
MOV AX, 1 ; 将1赋给AX寄存器
- 标签:标签是用来标识代码块或跳转目标的符号名称。它们通常以冒号(:)结尾,并且必须在代码中唯一。标签通常用于无条件或有条件跳转的目标。
LOOP_START: ; 这里是循环的代码 JMP LOOP_START ; 无条件跳转回LOOP_START
- 寄存器:汇编语言中经常使用寄存器来存储和操作数据。不同的体系结构有不同数量和名称的寄存器。例如,x86体系结构有通用寄存器如AX、BX、CX、DX等。
MOV AX, 10 ; 将10赋给AX寄存器 ADD BX, AX ; 将AX的值加到BX寄存器中
- 指令:汇编语言使用特定的指令来执行操作,如数据移动、算术运算、逻辑运算等。每个指令都有特定的操作码和操作数。
MOV AX, BX ; 将BX寄存器的值复制到AX寄存器 ADD AX, 5 ; 将AX寄存器的值加5
- 数据定义:在汇编程序中,需要定义和分配内存空间来存储数据。这可以通过使用伪指令来实现,如DB(定义字节)、DW(定义字)、DD(定义双字)等。
myData DB 10 ; 定义一个字节大小的变量myData,初始值为10 myArray DW 5, 10, 15, 20 ; 定义一个字数组
- 栈操作:栈是在汇编语言中广泛使用的数据结构,用于存储临时数据和函数调用信息。常见的栈操作包括PUSH(入栈)和POP(出栈)指令。
PUSH AX ; 将AX寄存器的值入栈 POP BX ; 将栈顶的值弹出到BX寄存器
- 条件分支:汇编语言支持条件分支,用于根据条件执行不同的代码块。条件分支通常使用CMP(比较)和条件跳转指令(如JE、JNE、JG、JL等)来实现。
CMP AX, BX ; 比较AX和BX的值 JE EqualLabel ; 如果相等,跳转到EqualLabel JNE NotEqualLabel ; 如果不相等,跳转到NotEqualLabel
- 循环结构:循环通常使用条件跳转指令来实现。汇编语言支持不同类型的循环,如计数循环和条件循环。
MOV CX, 10 ; 设置循环计数器 LOOP_START: ; 循环体代码 DEC CX ; 减少计数器 JNZ LOOP_START ; 如果计数器不为零,继续循环
整数溢出漏洞
攻击者可构造特殊参数来触发整数溢出,以一段预设信息覆盖一个已分配的堆缓冲区,造成远程服务崩溃或者改变内存数据并执行任意代码。
IA-32常用指令类型
⊙ \odot ⊙ 传送指令
- 通用数据传送指令
MOV:一般传送,包括movb、movw和movl等
MOVS:符号扩展传送,如movsbw、movswl等
MOVZ:零扩展传送,如movzwl、movzbl等
XCHG:数据交换
PUSH/POP:入栈/出栈,如pushl,pushw,popl,popw等 - 地址传送指令
LEA:加载有效地址,如leal (%edx,%eax), %eax”的功能为R[eax]←R[edx]+R[eax],执行前,若R[edx]=i,R[eax]=j,则指令执行后,R[eax]=i+j - 输入输出指令
IN和OUT:I/O端口与寄存器之间的交换 - 标志传送指令
PUSHF、POPF:将EFLAG压栈,或将栈顶内容送EFLAG
⊙
\odot
⊙ 控制转移指令
指令执行可按顺序或跳转到转移目标指令处执行
- 无条件转移指令
JMP DST:无条件转移到目标指令DST处执行 - 条件转移
Jcc DST:cc为条件码,根据标志(条件码)判断是否满足条件,若满足,则转移到目标指令DST处执行,否则按顺序执行 - 条件设置
SETcc DST:将条件码cc保存到DST(通常是一个8位寄存器 ) - 调用和返回指令(用于过程调用)
CALL DST:返回地址RA入栈,转DST处执行
RET:从栈中取出返回地址RA,转到RA处执行
I/O
⊙ \odot ⊙ 操作系统的三大部分
内核
操作系统五大管理功能一般都有操作系统内核负责
外壳
外壳程序负责接收用户操作,提供与用户的交互界面
一般操作系统提供给一般用户的界面主要有两种:文本界面;GUI图形界面。程序员入口:API
管理工具和附属软件
一般是操作系统在发布时附带提供给用户的,用户安装完操作系统,就可以利用操作系统自带的管理工具和软件进行一些基本操作
⊙ \odot ⊙ 操作系统的功能
CPU的控制与管理——处理器管理
内存的分配与管理——存储器管理
外部设备的控制与管理——设备管理
文件管理——文件管理
作业管理和控制——用户接口