计算机系统-x86架构下的寄存器与寻址
一:段的概念
比方说有这样一段汇编程序
.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架构下的寄存器与寻址相关推荐
- x86架构下的安卓虚拟化
目录 一 国内现状... 1 二 实现方案... 1 三 测试方案... 2 四 技术难点... 4 一 国内现状 国内云手游解决方案大致分为三种: 1.真实手机板卡机器插卡方案 2.使用ARM服务器 ...
- 解答:x86架构下,页面大小为什么是4K?
前提:32位逻辑地址空间的计算机系统,三级页表,每个页中每个条目占4Byte,即32位的数据 以上前提是目前x86架构32位系统的真实情况 设:页大小为X(byte) 则:X/4就是每个页中可以存取的 ...
- x86架构下,页面大小为什么是4K?
前提:32位逻辑空间的计算机OS,两级页表,每个页中每个条目占4bytes,即32位的数据 以上前提是目前X86架构的32为系统的真实情况: 设页大小为X(byte),则X/4为每个页可以存取的条目的 ...
- 卅年史诗!地球上出现过的CPU完全收藏 - (26-28) x86架构下的其它CPU巨鳄 Cyrix,NexGen,IDT/Transmeta(组图)
●Cyrix CPU介绍 突然想起来,X86架构的CPU还有Cyrix公司啊!那我们就接着回顾吧. M1 M1 ,背面 100MHz的M1 100MHz的M1,背面 还是M1,不过公司名称换了 换了名 ...
- 如何在x86架构下进行ARM镜像的构建与运行
这篇文章介绍一下使用QEMU进行容器化的构建和执行方式. 目录 QEMU是什么 常见问题的场景 问题再现 事前准备 启动容器并进入 解决方法 结果确认 构建ARM镜像并确认 QEMU是什么 QEMU是 ...
- x86架构下 CF与OF标志位 带符号和无符号运算 详解
针对能够影响OF和CF标志位的指令,一般来说是涉及到数据运算的指令,这里使用add举例,即不区分有无符号的加法指令,参与运算的数据,从二进制层级去考虑. CF标志位 对于CF,它是carry flag ...
- x86 架构下的 BIOS 功能介绍
提到 BIOS ,想必想起来一句歌词:最熟悉的陌生人,哈哈... 一.BIOS简介 BIOS, 是英文"Basic Input Output System"的缩写,BIOS是个人电 ...
- 逃离x86架构-----CPU体系结构CISC与RISC之争
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 转载:h ...
- 【操作系统】X86架构的64位操作系统探索
背景 8086 系列芯片的成功带领英特尔 IA-32 指令集架构占据芯片市场的主导地位.20 世纪末,英特尔与惠普一同针对 64 位芯片展开研究,并推出 IA-64 指令集架构.然而,该架构与已经流行 ...
最新文章
- C#下用P2P技术实现点对点聊天
- Matlab数据的可视化 -- 三维表面图
- IntelliJ IDEA 建空包合并问题。
- (二)html5中的属性
- 【jzoj】2018.1.31 NOIP普及组——D组模拟赛
- chown –r mysql:mysql,mysql部署,操作及异常处理
- 面积积分_袁颖妍:用定理积分求平面区域面积(有代表性的9个例题)
- FastDfs之TrackerServer的详细配置介绍
- 多平台翻译=有道翻译+百度翻译+必应翻译+get Curl+xml转array
- python随机抽号_Python学习随记 ————随机抽号器(一)
- 计算机二进制转十进制怎么yun,二进制 十进制 十六进制
- 计算机里什么文件无法删除,电脑里面有哪些不能删除的文件?
- android app 缓存目录在哪里找,Android App的文件缓存目录
- Android架构分析之硬件抽象层(HAL)
- 黑客与画家——片段一
- 打造新圣魔大战简体中文终极版(H补丁、不能安装、运行问题)
- 联想私有云盘成功中标布丁酒店浙江股份有限公司云盘项目
- windows上gn编译指引
- 随机森林与极端随机森林
- 设备产线运维合集丨图扑数字孪生流水线,提升产品装配自动化效率
热门文章
- BootStrap中的日期时间组件datetimepicker
- linux 编译链接出错,Qt编译和链接错误
- 【电脑帮助】解决Wind10系统桌面没有“我的电脑”图标的问题
- vue ---- 将项目打包发布
- tornado web mysql_Tornado WEB服务器框架 Epoll-- 【Mysql数据库】
- 小学生计算机按键分布图,人教版(新版)小学信息三下第2课《常用按键掌握牢》课件.ppt...
- android软件自动启动软件下载,Android编程实现应用程序开机自启动的方法
- Your Bitbucket account has been locked. To unlock it and log in again you must solve a CAPTCHA.
- 微服务网关Zuul和Gateway的区别
- SpringBoot中修改tomcat最大连接数、最大线程数、最大等待数