一:段的概念
比方说有这样一段汇编程序

.data
abc DWORD 666
.code
call abcdef

可以肤浅的理解为abc DWORD 666这句代码存在的内存区域,叫做数据段,call abcdef这句代码存在的内存区域,叫做代码段,调用call指令的时候,还需要堆栈,而堆栈占用的那片内存区域,叫做堆栈段,那么大致的内存图如下,从图中可以看出,每个程序都有自己的段,而且代码段,堆栈段,数据段之间有可能连续,也有可能不连续

二:基址(段的起始位置)与段长度
段的起始位置也叫基址,与长度一样,是段的属性之一,从上图中可以看到
程序1的数据段,基址是10004,程序1的数据段长度是2
程序2的堆栈段,基址是10014,程序2的堆栈段长度是3

注意,上述只是举例子,实际情况是段起始地址必须是以0x00结尾的地址

三:地址总线的寻址能力
CPU如果要想获取某个内存处的地址,比如上图中,CPU想获取10003处的值,则CPU会将10003放到地址总线中,这样内存中的33这个数据,就会通过数据总线传递给CPU,这有个前提,就是地址总线中必须能放得下10003这个数才行,比方说,地址总线只有两条,每条线肯定只有高电平(1)或者低电平(0)两种选择,那么这个地址总线的表达能力最多是3,只能获取内存中0-3之间的数据,而8086CPU有20条地址总线,它的表达能力是220,内存中0-220之间位置都能获取到,也就是1MB,这种能力,叫做地址总线的寻址能力,8086的地址总线寻址能力是1MB

四:CPU的寻址能力,段地址,偏移地址
8086CPU是16位CPU,定义为一次处理,传输,暂存的数据最大值是216,也就是64KB,如果这样,那么8086的CPU寻址能力将是64KB

CPU的寻址能力导致的问题
从上文可以看出,CPU的寻址能力可以说是远远不如地址总线的寻址能力,这就好比地址总线是一个很宽的高速公路,而CPU却是一台特别慢的汽车,根本配不上这条高速公路,假如现在要获取内存位置65KB处的数据,CPU根本无法表达65KB这个信息给地址总线,这就很尴尬,因为这个原因,CPU使用地址加法器,让自己的输出从16位变成了20为,从而使CPU的寻址达到最大化,地址加法器的做法是取1个16位寄存器,将每个bit值,依次放到16跟地址总线中,这个寄存器里的值,就叫做段地址
取另外一个16为寄存器中的四个数据,放到剩下的4跟地址总线中,这叫做偏移地址(理解偏移长度更好一些)
说白了就是用两个16位寄存器,来表达20位地址总线中的数据

五:地址加法器
假设段地址16进制是:2000H
假设偏移长度16进制是:1H
经过地址加法器合成之后,CPU实际查询的内存是:20001H,该结果可以用以下公式计算
真实地址=段地址乘以16+偏移长度
注意:段地址乘以16,就是上文的基址(段的起始位置)
所以也可以说真实地址=基址(段的起始位置)+偏移长度
在8086架构中

CS寄存器存储代码段的段地址,IP寄存器存放代码段的偏移长度
DS寄存器存储数据段的段地址,多数情况下用DX存放数据段的偏移长度
SS寄存器存储堆栈段的段地址,SP寄存器存放堆栈段的偏移长度

CPU运行过程如下图

在8086中,设CS中的内容为M,IP中的内容为N,则CPU从M*16+N单元开始读取一条指令并执行,任意时刻,CPU都将CS:IP指向的内容当做指令执行
CS+IP通过地址加法器,合成一个内存地址,这个内存地址中的内容,就是CPU要执行的指令

注:8086中加电启动或复位后,CS和IP被设置成CS=FFFF,IP=0000,所以8086电脑开机之后执行的第一条指令是:FFFF0H存储单元的指令

四个段寄存器:CS/DS/SS/ES

六:CS和IP寄存器
如何修改CS和IP???

mov指令叫做传送指令,传送指令不可以修改cs寄存器,因为CPU就不提供这种功能,需要使用转移指令进行修改,一个典型转移指令就是jmp指令

jmp 段地址:偏移地址

//执行这条指令之后,CS=2AE3,IP=0003,接下来CPU将执行2AE33存储单元内的指令
jmp 2AE3:3

jmp 某一寄存器

// 将ax中的值放到ip寄存器中
jmp ax

日记:使用CALL指令将EIP内容读取到栈,这样我们就能获取到EIP中的内容了,然后使用RET/IRET指令修改栈,这样就实现了函数注入

七:DS寄存器
汇编代码有时候会遇见中括号的写法,这种写法叫做[address],这种方式是以字为单位进行操作的,千万要注意,"以字为单位"这句话,并且address只能是一个常量,或者一些指定的寄存器,它们分别是bx,bp,si,di,例如下面的汇编代码是正确的

mov ax,[666];使用ds作为段寄存器,默认就是ds
mov ax,[bx];使用ds作为段寄存器,因为中括号[]中有bx寄存器
mov ax,[bx+si];使用ds作为段寄存器,因为中括号[]中有bx寄存器
mov ax,[bx+di];使用ds作为段寄存器,因为中括号[]中有bx寄存器
mov ax,[bp];使用ss作为段寄存器,因为中括号[]中有bp寄存器
mov ax,[bp+si];使用ss作为段寄存器,因为中括号[]中有bp寄存器
mov ax,[bp+di];使用ss作为段寄存器,因为中括号[]中有bp寄存器

下面的汇编代码是错误的

mov ax,[bx+bp];bx和bp不能同时出现在同一个中括号里
mov ax,[cx]
mov ax,[dx]
mov ax,[ds]

假设DS=2000H,并且内存如下图

则执行mov ax,[1]这条汇编指令的时候,根据CPU位数不同,其处理也是不同的

8位CPU:将一个内存地址20001处的值B8挪到ax中
16位CPU:将一个内存地址20001处的值B8,20002处的值23,合并成一个16位数23B8H,然后将23B8H挪到ax中
32位CPU:将一个内存地址20001处的值B8,20002处的值23,20003处的01,20004出的B8,合并成一个32位数B80123B8H,挪到ax中

如何修改DS寄存器中的值?
由于CPU硬件设计问题,DS寄存器只能接收其他寄存器的值,而不接受立即数,例如下面的汇编语言是错误的

mov ds,1111H

要想让ds的值为1111H,则必须同一个一个寄存器进行中转,下面的汇编语言是正确的

mov ax,1111H
mov ds,ax

别问为什么,8086CPU就是这么设计的,我也不知道为什么

八:SS和SP寄存器
确定栈空间,就是确定栈顶在哪个位置,任意时刻,SS和SP都指向栈顶,段寄存器SS用于存放段地址,寄存器SP用于存放偏移地址,执行push和pop指令的时候,CPU根据SS:SP获取栈顶位置
当执行下面push指令时候
push ax
SP首先-2(8086CPU),将栈顶往上挪动2个存储单元,然后将ax中的内容放到栈内
相对的,pop指令的时候,sp首先会自动+2
注意:执行修改SS指令的时候,比如mov ss,xxx,此时CPU强制屏蔽中断,直到下一条指令执行完毕,所以,mov ss,xxx之后,下面的指令我们必须要修改sp才行
九:ES
与DS功能相同

计算机系统-x86架构下的寄存器与寻址相关推荐

  1. x86架构下的安卓虚拟化

    目录 一 国内现状... 1 二 实现方案... 1 三 测试方案... 2 四 技术难点... 4 一 国内现状 国内云手游解决方案大致分为三种: 1.真实手机板卡机器插卡方案 2.使用ARM服务器 ...

  2. 解答:x86架构下,页面大小为什么是4K?

    前提:32位逻辑地址空间的计算机系统,三级页表,每个页中每个条目占4Byte,即32位的数据 以上前提是目前x86架构32位系统的真实情况 设:页大小为X(byte) 则:X/4就是每个页中可以存取的 ...

  3. x86架构下,页面大小为什么是4K?

    前提:32位逻辑空间的计算机OS,两级页表,每个页中每个条目占4bytes,即32位的数据 以上前提是目前X86架构的32为系统的真实情况: 设页大小为X(byte),则X/4为每个页可以存取的条目的 ...

  4. 卅年史诗!地球上出现过的CPU完全收藏 - (26-28) x86架构下的其它CPU巨鳄 Cyrix,NexGen,IDT/Transmeta(组图)

    ●Cyrix CPU介绍 突然想起来,X86架构的CPU还有Cyrix公司啊!那我们就接着回顾吧. M1 M1 ,背面 100MHz的M1 100MHz的M1,背面 还是M1,不过公司名称换了 换了名 ...

  5. 如何在x86架构下进行ARM镜像的构建与运行

    这篇文章介绍一下使用QEMU进行容器化的构建和执行方式. 目录 QEMU是什么 常见问题的场景 问题再现 事前准备 启动容器并进入 解决方法 结果确认 构建ARM镜像并确认 QEMU是什么 QEMU是 ...

  6. x86架构下 CF与OF标志位 带符号和无符号运算 详解

    针对能够影响OF和CF标志位的指令,一般来说是涉及到数据运算的指令,这里使用add举例,即不区分有无符号的加法指令,参与运算的数据,从二进制层级去考虑. CF标志位 对于CF,它是carry flag ...

  7. x86 架构下的 BIOS 功能介绍

    提到 BIOS ,想必想起来一句歌词:最熟悉的陌生人,哈哈... 一.BIOS简介 BIOS, 是英文"Basic Input Output System"的缩写,BIOS是个人电 ...

  8. 逃离x86架构-----CPU体系结构CISC与RISC之争

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 转载:h ...

  9. 【操作系统】X86架构的64位操作系统探索

    背景 8086 系列芯片的成功带领英特尔 IA-32 指令集架构占据芯片市场的主导地位.20 世纪末,英特尔与惠普一同针对 64 位芯片展开研究,并推出 IA-64 指令集架构.然而,该架构与已经流行 ...

最新文章

  1. C#下用P2P技术实现点对点聊天
  2. Matlab数据的可视化 -- 三维表面图
  3. IntelliJ IDEA 建空包合并问题。
  4. (二)html5中的属性
  5. 【jzoj】2018.1.31 NOIP普及组——D组模拟赛
  6. chown –r mysql:mysql,mysql部署,操作及异常处理
  7. 面积积分_袁颖妍:用定理积分求平面区域面积(有代表性的9个例题)
  8. FastDfs之TrackerServer的详细配置介绍
  9. 多平台翻译=有道翻译+百度翻译+必应翻译+get Curl+xml转array
  10. python随机抽号_Python学习随记 ————随机抽号器(一)
  11. 计算机二进制转十进制怎么yun,二进制 十进制 十六进制
  12. 计算机里什么文件无法删除,电脑里面有哪些不能删除的文件?
  13. android app 缓存目录在哪里找,Android App的文件缓存目录
  14. Android架构分析之硬件抽象层(HAL)
  15. 黑客与画家——片段一
  16. 打造新圣魔大战简体中文终极版(H补丁、不能安装、运行问题)
  17. 联想私有云盘成功中标布丁酒店浙江股份有限公司云盘项目
  18. windows上gn编译指引
  19. 随机森林与极端随机森林
  20. 设备产线运维合集丨图扑数字孪生流水线,提升产品装配自动化效率

热门文章

  1. BootStrap中的日期时间组件datetimepicker
  2. linux 编译链接出错,Qt编译和链接错误
  3. 【电脑帮助】解决Wind10系统桌面没有“我的电脑”图标的问题
  4. vue ---- 将项目打包发布
  5. tornado web mysql_Tornado WEB服务器框架 Epoll-- 【Mysql数据库】
  6. 小学生计算机按键分布图,人教版(新版)小学信息三下第2课《常用按键掌握牢》课件.ppt...
  7. android软件自动启动软件下载,Android编程实现应用程序开机自启动的方法
  8. Your Bitbucket account has been locked. To unlock it and log in again you must solve a CAPTCHA.
  9. 微服务网关Zuul和Gateway的区别
  10. SpringBoot中修改tomcat最大连接数、最大线程数、最大等待数