CPU寄存器与寻址方式

news2024/10/4 18:34:07

CPU寄存器与寻址方式

  • 1 CPU寄存器
  • 2 表达数据位置
  • 3 寻址方式
    • 3.1 直接寻址
    • 3.2 寄存器间接寻址
    • 3.3 寄存器相对寻址
    • 3.4 基址变址寻址
    • 3.5 相对基址变址寻址
    • 3.6 按比例变址寻址(SIB)

本文属于《 X86指令基础系列教程》之一,欢迎查看其它文章。

1 CPU寄存器

以下为X64架构下,CPU具备的通用目的寄存器情况。
在这里插入图片描述

  • X64为64位寻址,因此寄存器为64位,如红色框所示,具备rax~r15共16个寄存器;
  • X86为32位寻址,因此寄存器为32位,如蓝色框所示,具备eax~esp共8个寄存器;
  • 8086为16位寻址,因此寄存器为16位,如橙色框所示,具备ax~sp共8个寄存器。

X64将X86的8个通用寄存器扩展为64位,增加了8个新的通用64位寄存器。64位寄存器的名称都以字母“r”开头(当然,寄存器名称不区分大小写,也可以是“R”开头),例如,eax的64位扩展寄存器命名为rax,新增加的寄存器命名从r8到r15。
每个寄存器的低32位,低16位,低8位可在操作数中直接寻址。这包括像esi这样的寄存器,其低8位在以前是不能直接寻址的。

2 表达数据位置

汇编语言中用3个概念来表达数据的位置。

  • (1)立即数(idata)
    对于直接包含在机器指令中的数据(执行前在CPU的指令缓冲器中),在汇编语言中称为:立即数(idata),在汇编指令中直接给出。

例:

mov ax,1
add bx,2000h
or bx,00010000b 
mov al,'a’
  • (2)寄存器
    指令要处理的数据在寄存器中,在汇编指令中给出相应的寄存器名。

例:

mov ax,bx
mov ds,ax
push bx
mov ds: [0],bx
push ds
mov ss,ax
mov sp,ax
  • (3)段地址(SA)和偏移地址(EA)
    指令要处理的数据在内存中,在汇编指令中可用[X]的格式给出EA,SA在某个段寄存器中。
    存放段地址的寄存器可以是默认的,比如:
mov ax, [0]
mov ax, [di]
mov ax, [bx+8]
mov ax, [bx+si]
mov ax, [bx+si+8]

等指令,段地址默认在 ds 中。

mov ax, [bp]
mov ax, [bp+8]
mov ax, [bp+si]
mov ax, [bp+si+8]

等指令,段地址默认在 ss 中。

存放段地址的寄存器也可以是显性给出的,比如以下的指令。

mov ax,ds: [bp]			含义:(ax)=((ds)*16+(bp))
mov ax,es: [bx]			含义:(ax)=((es)*16+(bx))
mov ax,ss: [bx+si]		含义: (ax)=((ss) *16+ (bx) + (si))
mov ax,cs: [bx+si+8]	含义: (ax)=((cs) *16+ (bx) + (si) +8)

3 寻址方式

以下为8086 CPU支持的常见寻址方式,有以下五种。
在这里插入图片描述
当数据存放在内存中的时候,我们可以用多种方式,来给定这个内存单元的偏移地址,这种定位内存单元的方法,一般被称为寻址方式
接下来,我们对每种寻址,进行举例说明。

3.1 直接寻址

指令形式:[idata],比如:

mov ax, [2000h]

段地址默认在 ds 中,含义:(ax) = ((ds) * 16 + 2000h),表示将ds段寄存器中基址 * 16 + 2000h,所指向的内存,拷贝到ax寄存器中,长度为2字节。

3.2 寄存器间接寻址

[bx] 为例,比如:

mov ax, [bx]

段地址默认在 ds 中,含义:(ax) = ((ds) * 16 + (bx)),表示将ds段寄存器中基址 * 16 + bx寄存器中偏移,所指向的内存,拷贝到ax寄存器中,长度为2字节。
相比[idata]直接寻址,多了一步,即需要先读取bx寄存器中的偏移,因此叫间接寻址。

3.3 寄存器相对寻址

[bx+idata] 为例,比如:

mov ax, [bx+2000h]

段地址默认在 ds 中,含义:(ax) = ((ds) * 16 + (bx) + 2000h),表示将ds段寄存器中基址 * 16 + bx寄存器中偏移 + 2000h,所指向的内存,拷贝到ax寄存器中,长度为2字节。
相比[bx]间接寻址,又多了一步,即额外还要加一个相对bx寄存器的常量偏移,因此叫寄存器相对寻址。

3.4 基址变址寻址

[bx+si] 为例,比如:

mov ax, [bx+si]

段地址默认在 ds 中,含义:(ax) = ((ds) * 16 + (bx) + (si)),表示将ds段寄存器中基址 * 16 + bx寄存器中偏移 + si寄存器中偏移,所指向的内存,拷贝到ax寄存器中,长度为2字节。

3.5 相对基址变址寻址

[bx+si+idata] 为例,比如:

mov ax, [bx+si+2000h]

段地址默认在 ds 中,含义:(ax) = ((ds)*16 + (bx) + (si) + 2000h),表示将ds段寄存器中基址 * 16 + bx寄存器中偏移 + si寄存器中偏移 + 2000h,所指向的内存,拷贝到ax寄存器中,长度为2字节。
相比[bx+si]寻址,多了一步,即额外还要加一个相对[bx+si]寄存器的常量偏移,因此叫相对基址变址寻址。

3.6 按比例变址寻址(SIB)

上面5种寻址方式是8086以上的CPU,均具备的基本寻址方式。
按比例变址寻址,也称为"scale-index-base"(SIB)寻址,是仅在32和64位CPU架构才支持的内存寻址方式。
在这里插入图片描述
在SIB寻址中,地址计算分为三个部分:基址、索引和比例因子。

  • 基址(base),包含一个或多个寄存器,用于指定基址。在指令中,可以使用一个或多个寄存器来作为基址。这些寄存器可以是通用寄存器(如RAX、RBX等)或系统寄存器(如CR3等)。

  • 索引(index),包含一个或多个寄存器,用于指定在基址上的偏移量。在指令中,可以使用一个或多个寄存器来作为索引。这些寄存器可以是通用寄存器(如RCX、RDX等)或系统寄存器(如RSI、RDI等)。

  • 比例因子(scale),是一个常数,用于指定比例因子。在指令中,可以使用一个字节或多个字节来表示比例因子。比例因子的值可以是1、2、4、8等,具体取决于指令和操作的要求。

  • 位移量(displacement),可选,可以是立即数(常量)或寄存器值,它表示相对于基址的偏移量。

通过将基址、索引和比例因子结合起来,可以计算出最终的内存地址。
计算公式为:内存地址 = 基址 + 索引 * 比例因子 + 位移量(若存在)。其中,“+”表示加法运算,“*”表示乘法运算。

按比例变址寻址,我们可以用[- -][- -]符号来表示。
例如:

mov eax,[ebx+ecx*2]

含义:(eax) = ((ebx) + (ecx) * 2),表示将ebx寄存器中基址 + ecx寄存器值 * 2,所指向的内存,拷贝到eax寄存器中,长度为4字节;位移量为0。

mov eax,[ebx+ecx*2+100h]

含义:(eax) = ((ebx) + (ecx) * 2 + 100h),表示将ebx寄存器中基址 + ecx寄存器值 * 2 + 100h,所指向的内存,拷贝到eax寄存器中,长度为4字节;位移量为100h。


参考文档:

  • 《汇编语言 第3版》 王爽 清华大学出版社
  • 《X64汇编语言寄存器结构及其与X86架构编程区别》
  • 《汇编语言的寻址模式及示例》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1124864.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CDN+Nginx反向代理来隐藏c2地址

思路:通过借助CDN和Nginx反向代理和HTTPS来隐藏真实c2服务器Nginx反向代理:通过Nginx对外部流量转发到本地,再设置防火墙只允许localhost访问cs端口达到IP白名单的效果 准备 在这个实验环境中,我们需要准备服务器两台(一台服务端…

1978-2021年全国各省有效灌溉面积数据

1978-2021年全国各省有效灌溉面积数据 1、时间:1978-2021年 2、来源:农业统计NJ、各省NJ、国家统计J 3、指标:有效灌溉面积 4、范围:31省市 5、指标解释: 有效灌溉面积指具有一定的水源,地块比较平整…

爽,我终于实现了selenium图片滑块验证码!【附代码】

因为种种原因没能实现愿景的目标,在这里记录一下中间结果,也算是一个收场吧。这篇文章主要是用selenium解决滑块验证码的个别案列。 思路: 用selenium打开浏览器指定网站 将残缺块图片和背景图片下载到本地 对比两张图片的相似地方&#x…

驱动day4作业

通过字符设备驱动的分步实现编写LED驱动,另外实现特备文件和设备的绑定 head.h #ifndef __HEAD_H__ #define __HEAD_H__ typedef struct{unsigned int MODER;unsigned int OTYPER;unsigned int OSPEEDR;unsigned int PUPDR;unsigned int IDR;unsigned int ODR; }…

2007-2022 年上市公司国内外专利授权情况数据

2007-2022 年上市公司国内外专利授权情况 1、来源:国家知识产权局 2、时间:2007-2022 年 3、范围:上市公司 4、指标: 证券代码、年份、省份、城市、行业代码、授权地区、申请类型、专利、发明专利、实用新型、外观设计 5、…

SpringBoot读取Resource下文件的几种方式读取jar里的excel,文件损坏

在项目中涉及到Excle的导入功能,通常是我们定义完模板供用户下载,用户按照模板填写完后上传; 这里待下载模板位置为resource/template/员工基础信息导入模板.xlsx, 分别尝试了四种读取方式,并且测试了四种读取方式分别…

Multi-task Classification Model Based On Multi-modal Glioma Data

框架 体会 为什么不对三个任务用一个CNN呢? 作者未公布代码

解决VMware虚拟机更新17.5.0版本后,启动虚拟机导致电脑重启的问题。(建议收藏)

今天VMware虚拟机又迎来了新的一次更新,这次更新重点在于安全性提高了不少。 更新也是花了不少时间,更新完成后,我满怀着激动欣喜的心情打开了我的Kali,。。。哎,不是,怎么黑屏了,然后看到了物…

报错:The supplied javaHome seems to be invalid. I cannot find the java executable

AS 升级遇到的问题 问题 升级 Android Studio,碰到无法检测到 java The supplied javaHome seems to be invalid. I cannot find the java executable. Tried location: D:\Program Files\Android\Android Studio\jre\bin\java.exe 然后去网上找解决思路。 终于…

【Java集合类面试六】、 HashMap有什么特点?

文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。 面试官:HashMap有什么特点&…

订水商城H5实战教程-02系统登录

目录 1 创建数据源2 创建自定义应用3 创建全局变量4 实现登录功能5 控制弹窗是否显示6 最终的效果 上一篇我们分析了订水商城的功能,功能分析好了之后,就需要开发功能。用户登录商城的第一步就是进行登录,登录的时候需要同意用户协议&#xf…

Apollo插件:个性化你的开发流程

前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 「推荐专栏」: ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄,vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

网络安全(黑客技术)—自学

目录 一、自学网络安全学习的误区和陷阱 二、学习网络安全的一些前期准备 三、网络安全学习路线 四、学习资料的推荐 想自学网络安全(黑客技术)首先你得了解什么是网络安全!什么是黑客! 网络安全可以基于攻击和防御视角来分类&am…

SpringBoot AOP + Redis 延时双删功能实战

一、业务场景 在多线程并发情况下,假设有两个数据库修改请求,为保证数据库与redis的数据一致性,修改请求的实现中需要修改数据库后,级联修改Redis中的数据。 请求一:A修改数据库数据 B修改Redis数据 请求二&#xff…

【Java集合类面试八】、 介绍一下HashMap底层的实现原理

文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。 面试官: 介绍一下HashMap底层的…

SSM - Springboot - MyBatis-Plus 全栈体系(三十五)

第八章 项目实战 四、后台功能开发 2. 首页模块开发 2.1 查询首页分类 2.1.1 需求描述 进入新闻首页,查询所有分类并动态展示新闻类别栏位 2.1.2 接口描述 url 地址:portal/findAllTypes 请求方式:get 请求参数:无 响应数据&#xff…

一文解读 SmartX 超融合虚拟化下的网络 I/O 虚拟化技术

随着技术的不断发展,不少行业应用都对网络性能和隔离性有着越来越高的要求。例如: 低延迟:一些期货行业用户选择在期货公司机房托管服务器并自行编写交易程序,以实现对市场波动的快速(微秒级)反应。尤其是在…

DYC算法开发与测试(基于ModelBase实现)

ModelBase是经纬恒润开发的车辆仿真软件,包含两个大版本:动力学版本、智能驾驶版本。动力学版包含高精度动力学模型,能很好地复现车辆在实际道路中运行的各种状态变化,可用于乘用车、商用车动力底盘系统算法开发、控制器仿真测试&…

2023深圳CPSE安博会亮点指引

一、深圳安博会开展预告 10月25-28日,第十九届中国国际社会公共安全博览会(简称“CPSE安博会”)即将在深圳会展中心(福田)拉开帷幕。110,000㎡展示面积,130,000名专业观众,1000参展企业&#x…