计算机系统基础

计算机系统概述

图灵机模型:从一个状态到另一个状态的状态转换关系。(理论方面无突破)

实现:冯诺依曼体系结构——“存储程序”的思想确立了现代计算机的结构。

通用寄存器组: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%rax8%r8
1%rcx9%r9
2%rdxA%r10
3%rbxB%r11
4%rspC%r12
5%rbpD%r13
6%rsiE%r14
7%rdiF无寄存器
专用寄存器组: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。
采取补码的原因:

  1. 符号一致性:补码表示法统一了正数和负数的表示方式,无需特殊处理符号位。这使得计算机硬件和软件更加简化,因为加法和减法可以以相同的方式执行,而不必担心符号。
  2. 唯一零表示:在补码中,零的表示方式是唯一的,即所有位都为0。这消除了正零和负零之间的歧义,使零的比较和操作更加一致。
  3. 容易执行加法和减法:补码使加法和减法的实现更加简单,因为它们可以使用相同的硬件逻辑来执行。减法操作可以等效为加法操作,从而简化了处理器设计。
  4. 容易检测溢出:在补码中,溢出的检测变得相对容易,因为溢出会导致最高位的进位或借位。这有助于确保数字运算的正确性。
  5. 数学一致性:补码与模运算和其他数学操作更加一致,使得数学运算更容易理解和分析。
  6. 节省硬件成本:相对于其他表示方法(如原码),补码的硬件逻辑较为简单,因此可以降低硬件成本和复杂度。

只有有符号数相减得到正确答案

硬件不判断乘法是否溢出,而是保留2n位。

u < < << << k = = == == u ∗ * 2 k 2^k 2k

无符号数除法采用逻辑右移方式,带符号整数采用算术右移方式
能整除时,直接右移得到结果,不能整除时,商采用朝零方向舍入的方式,也就是截断方式,即:移出的低位数直接丢弃。(带符号负整数不对,需要加偏移量 2 k − 1 2^k-1 2k1,然后再右移 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。

  1. 注释:在汇编语言中,注释是非常重要的,它们用于解释代码的目的和功能。通常,注释使用分号(;)或特定的注释指令来添加。例如,在x86汇编中,注释可以使用";"添加。

MOV AX, 1 ; 将1赋给AX寄存器

  1. 标签:标签是用来标识代码块或跳转目标的符号名称。它们通常以冒号(:)结尾,并且必须在代码中唯一。标签通常用于无条件或有条件跳转的目标。

LOOP_START: ; 这里是循环的代码 JMP LOOP_START ; 无条件跳转回LOOP_START

  1. 寄存器:汇编语言中经常使用寄存器来存储和操作数据。不同的体系结构有不同数量和名称的寄存器。例如,x86体系结构有通用寄存器如AX、BX、CX、DX等。

MOV AX, 10 ; 将10赋给AX寄存器 ADD BX, AX ; 将AX的值加到BX寄存器中

  1. 指令:汇编语言使用特定的指令来执行操作,如数据移动、算术运算、逻辑运算等。每个指令都有特定的操作码和操作数。

MOV AX, BX ; 将BX寄存器的值复制到AX寄存器 ADD AX, 5 ; 将AX寄存器的值加5

  1. 数据定义:在汇编程序中,需要定义和分配内存空间来存储数据。这可以通过使用伪指令来实现,如DB(定义字节)、DW(定义字)、DD(定义双字)等。

myData DB 10 ; 定义一个字节大小的变量myData,初始值为10 myArray DW 5, 10, 15, 20 ; 定义一个字数组

  1. 栈操作:栈是在汇编语言中广泛使用的数据结构,用于存储临时数据和函数调用信息。常见的栈操作包括PUSH(入栈)和POP(出栈)指令。

PUSH AX ; 将AX寄存器的值入栈 POP BX ; 将栈顶的值弹出到BX寄存器

  1. 条件分支:汇编语言支持条件分支,用于根据条件执行不同的代码块。条件分支通常使用CMP(比较)和条件跳转指令(如JE、JNE、JG、JL等)来实现。

CMP AX, BX ; 比较AX和BX的值 JE EqualLabel ; 如果相等,跳转到EqualLabel JNE NotEqualLabel ; 如果不相等,跳转到NotEqualLabel

  1. 循环结构:循环通常使用条件跳转指令来实现。汇编语言支持不同类型的循环,如计数循环和条件循环。

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的控制与管理——处理器管理
内存的分配与管理——存储器管理
外部设备的控制与管理——设备管理
文件管理——文件管理
作业管理和控制——用户接口

  • 18
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值