计算机系统基础 4 寻址方式

        对于一条指令,我们重点关注它两点:执行什么样的操作,操作数在哪里。

        操作数存放的位置即为存放地址,一般是CPU内寄存器、主存、或者I/O设备端口。当操作数在主存时,我们重点关注段址/段选择符、段内偏移。

        寻找操作数存放地址的方式称为寻址方式。

        双操作数的指令格式为:操作符  OPD OPS,如ADD  EAX  EBX,执行(OPD) +  (OPS)   ➡   OPD( (EAX) (目的操作数地址) + (EBX)(源操作数地址)   ➡   EAX)

立即寻址 

        操作数直接放在指令中,在指令的操作码后;

        操作数是指令的一部分,位于代码段中;

        指令中的操作数是8位、16位或32位二进制数。

        立即操作数只能为源操作数。

        使用格式:

         例如: MOV  EAX , 12H     机器码:     B8 12 00 00 00

int   global;   // 注:global 是全局变量	
global = 2 * 5 ;

/*


00521A17      C7 05 B8 A5 52 00 0A 00 00 00 
              mov  dword ptr [global (052A5B8h)], 0Ah 


*/

寄存器寻址 

        使用格式: R

        功    能: 寄存器R中的内容即为操作数。

        说    明: 除个别指令外,R可为任意寄存器。

        例如:DEC   BL

  •         执行前 :  (BL) = 43H
  •         执    行:   (BL) – 1 = 43 H –1 = 42H ➡  BL
  •         执行后:   (BL) = 42H

直接寻址 

        操作数在内存中;

        操作数的偏移地址EA紧跟在指令操作码后面。

int global;
void address_compare()
{
   int local;
   global = 2*5;
   *((char *)&global + 1) = 20;
   printf("global = %d  %08x\n", global, global);

   local = 10;
   *((char*)&local + 1) = 20;
   printf("local = %d  %08x\n", local, local);
}

        全局变量的访问——直接寻址

         局部变量的访问——变址寻址(见后)

寄存器间接寻址 

        格式:[R]

        功能:操作数在内存中,操作数的偏移地址在寄存器R中。即(R) 为操作数的偏移地址。

        例如:MOV  AX, [ESI] 

        R 可以是:832位通用寄存器中的任意一个

        操作数的偏移地址:在指令指明的寄存器中

        操作数所在的段:   扁平内存管理模式下,(DS=SS

变址寻址 

        格式:V [ R × F ]

        功能:R中的内容 × F + V  为操作数的偏移地址

        例如:MOV  AL, 5[EBX*2]

        R 可以是832位通用寄存器,F 可为 1248

 

  • 全局变量编译后对应一个数值化的地址
  • 局部变量编译后对应一个地址为 [ebp – n]

基址加变址寻址 

格式: [BR+IR × F + V]

       或 V[BR][IR×F]  或  V [IR×F][BR]  或  V[BR+IR×F]

功 能:操作数的偏移 = 变址寄存器IR中的内容 × 比例因子F + 位移量V + 基址寄存器BR中的内容 。

EA = (IR)*F + V + (BR)

 例如:MOV  EAX, -6[EDI*2][EBP]

F 可为 1,2,4,8;
当使用32位寄存器时:

   BR可以是 EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP 之一;

   IR 可以是除ESP外的任一32位寄存器;

   未带比例因子的寄存器是 BR;

   当没有比例因子时,写在前面的寄存器是BR。

操作数的类型:

   若V为变量,则操作数类型为变量的类型;

   若V为常量,类型未知。

    当 V 中存在全局变量或标号时,用的段都是 DS,在 VS2019中, (DS)=(SS)。CS中的全局变量等同 DS段中的变量。

x86机器指令编码规则

① 指令前缀(prefix,非必需,0个或多个字节)

② 操作码(opcode,必须,1字节 ~ 3字节)

③ 内存/寄存器操作数(ModR/M,非必需): 指明寻址方式

④ 索引寻址描述 (SIB,非必需):指明基址寄存器、变址寄存器、比例因子

⑤ 地址偏移量(Displacement,非必需)

⑥ 立即数(Immediate,非必需)

操作码:

  • 指明了要进行操作。
  • 指明操作数的类型(一般看最后一个二进制)0:字节操作;  1字操作(32位指令中为双字操作);有指令前缀 66H对字操作。
  • 指明源操作数是寄存器寻址,还是目的操作数是寄存器寻址 (操作码的倒数第二个二进制位1目的操作数是寄存器寻址,0源操作数寄存器寻址;[寻址方式字节]配合使用

内存/寄存器操作数(ModR/M) :

Mod由2个二进制位组成,取值是00、01、10、11。
Mod与为R/M配合使用,明确一个操作的获取方法。
Reg/Opcode 确定另外一个寄存器寻址的寄存器编码
  • Mod=00, R/M =000,表示 用 [EAX] 寻址
  • Mod=00,R/M=100,  表示用[--][--] ,无位移量的基址加变址,在 SIB 字节指明基址/变址寄存器的编码

        Reg/Opcode 的编码:同一编码有多个寄存器,用哪一个寄存器,取决于指令前缀和操作码中的编码

mov  eax, [ebx]    ; 机器码是:8B 03    ➡ 00  000  011     [EBX]

mov [ebx], eax     ; 机器码是:89 03    ➡ 1000 1001  VS 1000 1011

操作码的倒数第二位:   1OPD是寄存器, 0OPS是寄存器

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RuoYi-Vue若依框架-代码生成器的使用

代码生成器 导入表 在系统工具内找到代码生成,点击导入,会显示数据库内未被导入的数据库表单,选择自己需要生成代码的表,友情提醒,第一次使用最好先导入一张表进行试水~ 预览 操作成功后可以点击预览查看效果&…

LeetCode每日一题[c++]-322.零钱兑换

题目描述 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。 你可以认为每种硬币的数量是无…

Linux系统磁盘管理

这里写目录标题 Linux系统磁盘管理磁盘容量检查磁盘分区fdisk分区gdisk分区 磁盘格式化磁盘挂载临时挂载磁盘永久挂载磁盘卸载挂载磁盘 交换分区SWAP创建swapfile格式化swap分区检测当前swap分区情况开启新建的SWAP分区关闭新建的swap分区 生产磁盘故障案例 Linux系统磁盘管理 …

【LeetCode热题100】108. 将有序数组转换为二叉搜索树

一.题目要求 给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 平衡二叉搜索树。 二.题目难度 简单 三.输入样例 示例 1: 输入:nums [-10,-3,0,5,9] 输出:[0,-3,9,-10,null,5] 解释&#x…

Python - epub2txt

文章目录 关于 epub2txt安装 命令行使用查看 options常见用法示例1 Python 代码调用manualabsl.app:absl.logging:epub2txt.__main__:absl.flags: 关于 epub2txt Convert epub file to txt github : https://github.com/ffreemt/epub2txt 安装 pip install epub2txt命令行使…

这个极其适合新手的Facebook聊单模式!必学!极度友好!

基于现在的网络流量来说,Facebook不仅仅是个人的社交圣地,更加是很多卖家的黄金市场,背后蕴藏着无限的商业潜力。对于刚刚踏入电商领域的新手而言,Facebook这个平台是个很好地展示产品、吸引客户,并实现销售的地方。 …

【刷题】滑动窗口精通 — Leetcode 30. 串联所有单词的子串 | Leetcode 76. 最小覆盖子串

送给大家一句话: 充满着欢乐与斗争精神的人们,永远带着欢乐,欢迎雷霆与阳光。 —— 赫胥黎 滑动窗口精通 前言Leetcode 30. 串联所有单词的子串题目描述算法思路 Leetcode 76. 最小覆盖子串题目描述算法思路 Thanks♪(・ω&#xf…

WorkPlus AI助理,为企业提供智能化客户服务,助力企业发展与竞争力

在当今竞争激烈的商业环境中,提供优质高效的客户服务是企业取得成功的关键。而AI智能客服的崛起,以其卓越的性能和功能,助力企业提升客户服务体验。WorkPlus AI助理作为一款领先的解决方案,能够实现智能化客户服务,满足…

TTS通用播放库技术设计

TTS音频播放库技术设计 目录介绍 01.整体介绍概述 1.1 项目背景介绍1.2 遇到问题1.3 基础概念介绍1.4 设计目标1.5 问题答疑和思考 02.技术调研说明 2.1 语音播放方案2.2 TTS技术分析2.3 语音合成技术2.4 方案选择说明2.5 方案设计思路2.6 文本生成音频 03.系统TTS使用实践 3…

如何在CentOS7部署openGauss管理系统并实现固定公网地址连接

文章目录 推荐前言1. Linux 安装 openGauss2. Linux 安装cpolar3. 创建openGauss主节点端口号公网地址4. 远程连接openGauss5. 固定连接TCP公网地址6. 固定地址连接测试 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不…

抖音小店怎么做?起店流程大分享,可收藏!

大家好,我是电商糖果 会开店,但是不会起店。 这是不是很多电商商家遇到难题,尤其是刚开始做抖音小店的商家。 店开好几月也没有流量,不出单。 这里糖果就来分享一下,我这边自己总结的起店流程。 不敢自夸是最好的…

类和对象三部曲(one)

都说C语言是面向过程,分析出求解问题的步骤,通过函数调用来逐步解决问题。 拿洗衣服来举例,C关注的是一个过程: 那么C是什么呢? 面向对象的编程语言。 面向对象对象指什么? 象棋里的对象么?…

大模型时代5个最顶级的向量数据库

大家好,数字时代推动我们进入了由人工智能和机器学习为主导的时代,向量数据库已经成为存储、搜索和分析高维数据向量的不可或缺的工具,本文将介绍5个顶级的向量数据库。 1.Chroma 使用ChromaDB构建LLM应用程序 Chroma是开源嵌入数据库。Chr…

医疗行业对SDWAN专线的需求

随着信息技术的发展和医疗行业的数字化转型,SDWAN(软件定义广域网)作为一种新兴的网络解决方案,越来越受到医疗机构的重视和应用。医疗行业对SDWAN专线的需求主要体现在以下几个方面: 1、高度可靠的网络连接 医疗机构…

YOLOv9改进策略:卷积魔改 | DCNv4更快收敛、更高速度、更高性能,效果秒杀DCNv3、DCNv2等 ,助力检测 | CVPR2024

💡💡💡本文改进内容: DCNv4来自CVPR2024 的论文,它不仅收敛速度明显快于DCNv3,而且正向速度提高了3倍以上。这一改进使DCNv4能够充分利用其稀疏特性,成为最快的通用核心视觉算子之一。 改进结构…

CDP7 下载安装 Flink Percel 包

下载链接:https://www.cloudera.com/downloads/cdf/csa-trial.html 点击后选择版本, 然后点击download now,会有一个协议,勾选即可,然后就有三个文件列表, 我这里是已经注册登录的状态,如果没…

继承和多态(2)(多态部分)

提前讲的重要知识点 一个类在没有父类的情况下默认有一个父类为Object类。 而当在有父类情况下,如果你那父类没有父类,则其父类的父类默认为object类,所以即使一个类有父类,其内部还是有object类。 object类都是隐藏起来的&…

谈一谈BEV和Transformer在自动驾驶中的应用

谈一谈BEV和Transformer在自动驾驶中的应用 BEV和Transformer都这么火,这次就聊一聊。 结尾有资料连接 一 BEV有什么用 首先,鸟瞰图并不能带来新的功能,对规控也没有什么额外的好处。 从鸟瞰图这个名词就可以看出来,本来摄像头…

msvcp110.dll丢失修复办法

在计算机使用过程中,我们经常会遇到一些扩展名为.dll的文件,这些文件是动态链接库文件,用于提供程序运行时所需的函数和资源。其中,msvcp110.dll文件是一个非常重要的动态链接库文件,它属于Microsoft Visual C 2012 Re…

学习数据结构:算法的时间复杂度和空间复杂度

一、算法的复杂度 衡量一个算法的好坏,一般是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度。 时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。 算法的时间复杂度 算法中的基本操作的…