汇编基础复习
什么是汇编语言
计算机是由各种编程语言组成(程序级不包括系统级)
三类机器语 (MachineLanguage). 智能识别 0101010101010101。。。。汇编 (Assembly Language)。汇编语言以.asm后缀结尾高级 (High LeveLanguage)X86 汇编
X64 X86 寄存器穿参方式
80 * 86 寄存器组通用 寄存器 ABCD x BP Di SI 等八个ax bx cx dx x 数据寄存器 以字形式来访问。十六位 八位字节方式访问 AX (accumulator) 累加器 算数运算主要寄存器Bx (base) 通用寄存器 作为基址CX (count) 通用寄存器。 保存计数值Dx (data) 通用寄存器 双字长运算时 把DX 和 AX 组合在一起作为双字长度 DX 存放高位字
SP BP SI DI 这四个十六位寄存器可以向数字寄存器一样在运算过程中存放操作数但他们只能以字 16 位使用SP (stack pointer) 堆栈指针寄存器。用来指示段顶的偏移地址BP (base pointer) 基址指针寄存器SI (source index) 源变址 寄存器 用来确定某一存储单元的地址 有增量 减量的功能DI (destination index) 目的变址寄存器 用来确定段中存储单元的地址。有增量减量功能 OF SF ZF CF ......等IP (instruction poiter) 为指针寄存器 他用来放代码中的偏移地址。在程序运行的过程中 他始终指向下一条指令的首要地址。与段寄存器 CS 连用确定下一条指令的物理地址 IP寄存器是计算机中很重要的控制寄存器SP 堆栈指针寄存器 他与堆栈段寄存器连用来确定堆栈中栈顶的地址FLAGS为标志寄存器 又称为状态寄存器 (program status word PSW) 这是一条存放条件码标识。控制标志和系统标识。 if 判断等用这些标志寄存器OF (overflow flag) 溢出标识 运算过程中 操作数超出了机器能够标识的范围叫做溢出 此时 OF为1 否者 0 SF (sign flag) 为符号标识。记录运算过程中结果的符号 负数1 正数 0ZF (zero flag) 零标识位 运算结果为0 值为1 否则 0CF (carry flag) 进位标识 记录运算时最高有效位产生的进位制 AF (auxiliary carry flag) 辅助进位标记 记录运算时的第三个位 半个字节。产生的进位。进位时1 否则 0PF ( parity flag) 奇偶标识位。当操作结果数中 1的个数为偶数时为1 否则 0
段寄存器 CS DS SS ES 段寄存器也是一种专用寄存器 他们专用于存储器寻址 用来直接或者间接存放段地址 段寄存器长度为16DS (code segment) 代码段CS (data segment) 数据段SS (stack segment) 堆栈段Es (extra segment) 附加段
内存访问
每个程序有独立的 4GB空间。内存与寄存器都是存储数据使用。
内存以编号进行排序。 读取数据的时候使用编号 内存地址 32位 存储 8字节
内存地址上限时0xffffffff。 能存储的位数就是 (0xffffffff +1) *8 五种标识形式立即数寻址 寄存器寄存器 ➕ 立即数寄存器 ➕ 寄存器寄存器 ➕ 寄存器 ➕ 立即数
存储模式
大端数据高位 在低地址中
小端数据地位 在高的地址类似于0 0x 00000001 0x 00000012 0x 00000023 0x 00000034 0x 0000004.....
大端就是 从下往上
小端就是 从上往下
比如存储 0x ab11
两个字节 存储 大端模式。ab是高位存储于0x000000 11 是低位 0x000001
存储器的管理模式
intel公司的80X86 系列的cpu基本上采用内存分段的管理模式 他把内存分成若干段 每个段起点用一个段寄存器来记忆
计算机的内存单元以字节来存储来编址 每个储存单元规定一个编号 此编号就是存储单元的物理地址16位的采用了内存分段 段寄存器的概念
物理地址的形成方式
规定地址必须是16的倍数 所以值的形式是 xxx0h 前十六位二进制是变幻的 后四位是固定的0 基于内存地址的特性 我们可以保存前16位二进制来达到保存整个地址段 后四位左移补0获得存储单元的逻辑地址分为两个部分。段地址和偏移量物理地址 Pa = 地址段 ✖️ 16 + 偏移量