32位汇编背景知识

目录

  • 背景知识

    • GTDTR,是一个48位的寄存器, 指向的描述符表为全局描述符表GDT(Gloabl Descriptor Table)
    • LDTR,是一个16位的寄存器,指向局部描述符表LDTLocal Descriptor Table),每个任务一个独立的LDT
    • 段选择器
    • 内存分页机制

背景知识

以下说的知识皆以如非特别表明,皆说的是80386CPU

  1. 它的可寻址能力达到4GB
  2. 通过寄存器是32位

通用寄存器是32位的,2的32次方等于4GB,就可以使用一个通用寄存器来寻址,从而不必分段。虽然在地址上不再有分段的限制问题。但是,一个地址否可以被写入,可以被多少优先级的代码写入?等问题就出来,要解决此类问题,必须要在地址空间定义一些安全属性。这是由段选择器就有了作用。但是涉及属性和保护模式下段的其他参数和要表示的信息太多,要用64位的数据才能表示。

80386的段寄存器是16位的,无法放下保护模式下64位的段描述符。所以就把所有段的段描述符顺序放在内存中指定的位置,组成一个段描述符表(Descriptor Table);而段寄存器中的16位用来索引信息,指定这个段的属性用段描述符表中的第几个描述符来表示。可以通过它在段描述符表中"选择"一个项目以得到段的全部信息。这时段寄存器中的信息不再是段地址,而是一个指向段描述符表的索引值,段描述符表中存着我们的地址等信息。此时我们称寄存器为,段选择器

GTDTR,是一个48位的寄存器, 指向的描述符表为全局描述符表GDT(Gloabl Descriptor Table)

它包含所有任务都可用的段描述符,其中包括描述操作系统所使用的代码段,数据段和堆栈段的描述符及个任务的LDT段等;全局描述符表有且只有一个

LDTR,是一个16位的寄存器,指向局部描述符表LDTLocal Descriptor Table),每个任务一个独立的LDT

LDTR,是一个16位的寄存器,指向局部描述符表LDTLocal Descriptor Table),每个任务一个独立的LDT。它包含每个任务私有的代码段,数据段和堆栈段的描述符,也包含一些门的描述符,如任务门和调用门的描述符等

段选择器

段选择器是16位的,但是只有高13位表示索引值。前三位表示的含义如下;

  1. 0,1位表示程序的当前优先级RPL
  2. TI位用来表示段描述符的位置;TI = 0表示在GDT中,TI = 1表示在LDT

一个段选择器要做如下操作步骤才能找到基址

如果TF = 0

  1. 从GDTR寄存器中获取GDT的基址
  2. 将段选择器高13位当作索引得到段描述符
  3. 通过段描述符获取基址、限长、优先级等各种属性
  4. 以基址加上偏移地址得到最后的线性地址

如果TF = 1

  1. 从GDTR寄存器中获取GDT的基址
  2. 从LDTR中获取LDT所在段的位置索引
  3. 以段的位置的索引在GDT中得到LDT段的位置
  4. 将段选择器高13位当作索引得到段描述符
  5. 通过段描述符获取基址、限长、优先级等各种属性
  6. 以基址加上偏移地址得到最后的线性地址

内存分页机制

将物理地址不连续的内存的映射连在一起,在线性地址上视为连续。

同样他解决的是内存碎片化的问题

PG = 0 禁用分页,这时所有的

指令寻址的地址就是系统中的实际物理地址

PG = 1 启用分页,所有的线性地址要经过页表的映射才得到最后的物理地址

禁用分页读取数据步骤

  1. 线性地址就是物理地址,处理器直接从物理内存存取数据。

启用分页读取数据的步骤

  1. 更具页目录和页表指定的映射关系把地址映射到物理内存的真正位置
  2. CPU以映射后的物理地址在物理内存中存取数据

不管用那种机制,所有寻址指令使用的都是线性地址。

原文地址:https://www.cnblogs.com/songyaqi/p/11888249.html

时间: 2024-11-05 19:04:06

32位汇编背景知识的相关文章

汇编知识扫盲之16位汇编跟32位汇编的保护模式以及汇编代码编写

汇编知识扫盲之16位汇编跟32位汇编的保护模式以及汇编代码编写 一丶内存寻址模型 逻辑地址.线程地址.物理地址 了解汇编之前.先了解一下上面这些词的含义; 逻辑地址: 这个是邮编一起生成的.逻辑地址一般都是 段加段内偏移组成的.每个进程独享. 线性地址: 由分段管理机制.将逻辑地址转化为线性地址.这个了解即可.学过内核的人看到应该明白.如果没有学过.简单滤过即可(32位下逻辑 = 线性) 物理地址: 通过分页管理机制(内核中成为PDE PTE等页目录 页表等等)将线性地址转化为物理地址. 这些了

32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数

32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数 (如果想看所有代码,请下载课堂资料,里面有所有代码,这里会讲解怎么生成一个窗口程序) 一丶32位汇编编写Windows窗口程序 首先我们知道32位汇编是可以调用Windows API的,那么今天我们就调用windowsAPI来写一个窗口程序 如果你有windows开发知识,那么就很理解了,如果没有,那么跟着我写,跟着步骤去写,那么也可以写出来 首先我们要编写一个窗口程序(使用SDKAPI编写)有几个步骤 1.设计窗口类 2.注

32位汇编第三讲,RadAsm,IDE的配置和使用,以及汇编代码注入方式

32位汇编第三讲,RadAsm,IDE的配置和使用,以及汇编代码注入方式 一丶RadAsm的配置和使用 用了怎么长时间的命令行方式,我们发现了几个问题 1.没有代码提醒功能 2.编写代码很慢,记不住各种声明 那么现在有大神,已经帮我们做了一个IDE环境,就是RadAsm,首先简单介绍一下界面 (对于这个IDE(最新版是3.0)我已经打包好了,有中文版本,和英文版本) 我们需要配置一下环境 1.配置编译环境,配置lib文件库,配置Debug调试器 打开后会弹出 首先这里我们注意下面的几个选项 1.

32位汇编第四讲,干货分享,汇编注入的实现,以及快速定位调用API的数量(OD查看)

32位汇编第四讲,干货分享,汇编注入的实现,以及快速定位调用API的数量(OD查看) 昨天,大家可能都看了代码了,不知道昨天有没有在汇编代码的基础上,实现注入计算器. 如果没有,今天则会讲解,不过建议把昨天代码熟悉一遍(课程是紧跟着来的,请不要拉下任何一天,因为今天的知识, 可能就和昨天的知识挂钩,昨天的知识,和前天的挂钩.....,当然你如你懂汇编,不是新手,那么则可以直接往下看) 一丶远程线程注入,和汇编远程注入的区别 昨天的代码,大家可能看了(没看也没有关系,就是远程线程注入的代码,开发角

32位汇编第七讲,混合编程,内联汇编

32位汇编第七讲,混合编程 博客园IBinary原创 QQ:2510908331  博客连接:http://www.cnblogs.com/iBinary/ 转载请注明出处,谢谢 混合编程的概念,有时候我们会想,C语言可不可以调用汇编的函数,或者反过来调用 或者说C语言里面内部直接内联汇编去编写. 可以实现,静看怎么实现 一丶C语言调用汇编语言的函数 1.创建工程和代码 ①创建VC++控制台程序 FILE(文件) - NEW (新建) 然后我们打开源文件,一级一级展开,找到我们的main函数 那

64位gcc编译32位汇编

由于使用as和ld来编译链接汇编程序,在使用C库的时候比较麻烦,需要输入比较多的指令,所以使用gcc进行编译链接.由于书中内容是32位汇编程序,但是机器使用的是64位操作系统,自带的gcc也是64位的,导致编译生成的程序,一运行就会Segment Fault.经过查询之后,发现是调用printf函数的时候,总是报错,查询之后发现是32位汇编和64位汇编在调用C库的时候,32位使用pushl指令来压栈传递参数,而64位汇编是使用通用寄存器来传递参数的. 32汇编的代码是: 1 .code32 2

32位汇编第五讲,逆向实战干货,(OD)快速定位扫雷内存.

32位第五讲,逆向实战干货,快速定位扫雷内存. 首先,在逆向之前,大家先对OD有一个认识. 一丶OD的使用 标号1: 反汇编窗口 (显示代码的地址,二进制指令,汇编代码,注释) 标号2: 寄存器窗口(显示通用寄存器,段寄存器,以及浮点协处理器,32位中还有多媒体寄存器) 标号3: 信息窗口 (这个主要是显示当你运行到的程序的位置处的信息) 标号4: 数据窗口   (内存中的数据,可以在这里查看内存) 标号5:堆栈窗口 (查看栈中的内容,以及变量的内容) 标号6,标号7,标号8 ,属于工具窗口,不

linux下64位汇编的系统调用(3)

背景知识基本交代清楚了,下面我们实际写一个小例子看一下.代码的功能很简单,显示一行文本,然后退出.我们使用了syscall中的write和exit调用,查一下前面的调用号和参数,我们初步总结如下: write(即sys_write)调用号为1,需传递3个参数 unsigned int fd const char *buf size_t count exit(sys_exit)调用号为60,只需传递一个错误码 int error_code 如果该值为0表示程序执行成功. 因为以上两个调用最多的也只

64位汇编第二讲——64位汇编中局部变量使用及抬栈方法29171230

一.纯写64位汇编时局部变量处理和参数寄存器保存位置 纯写64位汇编和用VS2013写64位C代码生成的汇编会有一些格式上的区别,VS2013写64位C代码生成的汇编中是没用到栈基址寄存器rbp的,但是纯写汇编时只要申明了参数和使用了@LOCAL定义的局部变量,就会用到rbp.且看如下例子:1)用C写64位程序空函数生成的汇编代码, ;C代码 void FunTest2() { } ;汇编代码 000000013F753290 40 57 push rdi 000000013F753292 5F