win32汇编基础
阅读原文时间:2023年07月08日阅读:1

win32汇编基础知识

Debug 是“调试”的意思,Debug 版本就是为调试而生的,编译器在生成 Debug 版本的程序时会加入调试辅助信息,并且很少会进行优化,程序还是“原汁原味”的。

你没听错,不是任何一个程序都可以调试的,程序中必须包含额外的辅助信息才能调试,否则调试器也无从下手。

Release 是“发行”的意思,Release 版本就是最终交给用户的程序,编译器会使尽浑身解数对它进行优化,以提高执行效率,虽然最终的运行结果仍然是我们期望的,但底层的执行流程可能已经改变了。

编译器还会尽量降低 Release 版本的体积,把没用的数据一律剔除,包括调试信息。

最终,Release 版本是一个小巧精悍、非常纯粹、为用户而生的程序。

  • 实模式

  • 保护模式

  • 虚拟8086模式

    保护模式由实模式中进入

    重启切换三种模式

实模式和虚拟86模式都是为了向下兼容,而保护模式是对80386的主要支持模式

DOS操作系统的内存安排

“640KB限制”---是指操作系统和系统程序只能用从500h到A0000h不到640kb的地址空间

寻址方式

DOS

由于8086中的地址线有20位,而寄存器的长度只有16位,也就是说无法直接找到一个想达到的物理地址。例如:要找寻一个2ffffh地址单元中的内容,使用一个16位寄存器最多到FFFFh,所以需要组合形成最终的线性地址(物理地址)。

DOS中的段寄存器用于组合形成物理地址,默认是对段寄存器乘以10h,(例如 SR*10h+偏移地址),从而构成20位寻址,达到遍及内存的目的

80386

80386中的通用寄存器都是32位,也就是32位,可以直接遍历到所有的内存地址单元。所以段寄存器就不需要了吗?也不是,段寄存器在80386中发挥着间接作用。看下面:

由于保护模式下的段信息需要被保存,长度为64位,被叫做段描述符(Segment Descriptor)

于是80386中的段寄存器(16位),用于索引存放在内存其他地方中的段描述符,于是在386的操作中,更多的将它叫做段选择器

80386中引入了48位的GDTR和16位的LGTR,全局DT寄存器和局部DT寄存器

  • TI用于判定是GDT还是LDT,0表示在GDT中,1表示在LDT中
  • RPL=》优先级

可以看到,GDT中还存有LDT的位置信息,所以如果描述符存在于LDT中的话,我们还需要先拿到LDT的基地址

分页

。。。碎片化优化,提高内存的利用率。

就是操作系统中的分页机制,现下就是细节处理

页表与映射

CR3寄存器 用于保存页目录表页面的物理地址,因此被称为PDBR。由于目录是页对齐的,所以仅高20位有效,低12 位保留供更加高级的处理器使用。向CR3中装入一个新值时,低12位必须为0;但从 CR3中取值时,低12位被忽略

为什么是高20位有效?

每页4kb,这个和win32的虚拟模式有关,想想他是怎么欺骗8086程序的?同样只有20位内存单元,但内存单元缺扩大了4k倍

想想磁盘划分时,单位内存的大小是怎么实现的?==》放弃部分地址线的使用,间隔性的扩大

线性内存与物理内存的关系?【转】 物理内存和线性空间 - neba - 博客园 (cnblogs.com)

线性地址是在针对程序员来说的,就是说理论上是如此的。

分页-分段-段页式-缺页中断

虚拟内存

  • 每个程序都有自己4GB的寻址空间

    为什么是4GB,不是8GB或者16GB呢?

    这个是针对cpu最大的寻址空间来算的,也就是说如果是64位的寻址能力,其虚拟空间就是4GB*4GB了

  • 不同应用的线性地址空间是隔离的,但物理上是处于同一个内存区

  • DLL程序都是被插入到主程序中执行的,所以没有自己独有的空间,当他被插入时,也就算是主程序的一部分了

中断和异常

DOS(实模式)

DOS中使用中断向量表 int 3 >找到3号中断向量(4B)》前两个字节作为基地址,后两个地址作为偏移地址,从而获得中断入口

80386保护模式

一个中断或异常程序的信息使用8B进行存贮,于是采用中断描述符以及对应的中断描述符表(Interrupt Descriptor Table)

引入48位IDTR,高32位表示向量表的入口地址,低16位表示长度,也就是说

门的概念

就是在对高级别程序代码进行访问时,规定了访问入口

  • 指令集的检查

    1.特权指令--能改变GDTR,LDTRIDTR等关键寄存器的指令--只允许优先级0运行

    2.敏感指令--操作IO端口以及CLI STI等中断允许的指令(CLI Clear Interrupt | STI Start Interrupt--eflags寄存器IOPL位高于规定的优先级即可以执行

  • IO处理保护

MMU 内存管理单元 https://gitlib.com/page/pc-mmu.html

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器