8086处理器的寻址方式
概念
在计算机系统中,处理器操作和处理的是数值,那么,必定涉及数值从哪里来,处理后送到哪里去,这称为寻址方式(Addressing Mode)。
简单地说,寻址方式就是如何找到要操作的数据,以及如何找到存放操作结果的地方。
寄存器寻址
最简单的寻址方式是寄存器寻址。就是说,指令执行时,操作的数位于寄存器中,可以从寄存器里取得。
mov ax,cx
add bx,0xf000
inc dx
上述代码中
- 第一条指令的两个操作数都是寄存器,是典型的寄存器寻址
- 第二条指令的目的操作数是寄存器,因此,该操作数也是寄存器寻址
立即寻址
立即寻址又叫立即数寻址。也就是说,指令的操作数是一个立即数
add bx,0xf000
mov dx,label_a
以上,
- 第一条指令的目的操作数采用了寄存器寻址方式,用于提供被加数;
- 第二个操作数(源操作数)用于给出加数0xf000。这是一个直接给出的数值,不需要通过其他方式寻找,故称为立即数。这种寻址方式,称为立即寻址。
- 在第二条指令中,目的操作数也采用的是寄存器寻址方式。
- 尽管源操作数是一个标号,但是,标号是数值的等价形式,代表了它所在位置的汇编地址。因此,在编译阶段,它会被转化为一个立即数。因此,该指令的源操作数也采用了立即寻址方式
内存寻址
寄存器寻址的操作数位于寄存器中,立即寻址的操作数位于指令中,是指令的一部分。
传统上,这是两种速度较快的寻址方式。但是,它们也有局限性。
- 一方面,我们不可能总是知道要操作的数是多少,因此也就不可能总是在指令中使用立即数;
- 另一方面,寄存器的数量有限,不可能总指望在寄存器之间来回倒腾。
考虑到内存容量巨大,所以,在指令中使用内存地址,来操作内存中的数据,是最理想不过了。正是因为内存访问如此重要,处理器才拥有好几种内存寻址方式。
所谓的内存寻址方式,就是如何在指令中指定操作数的偏移地址,供处理器访问内存时使用,这个偏移地址也叫有效地址(Effective Address, EA)。
换句话说,内存寻址方式就是在指令中指定偏移地址(有效地址)如何计算。
直接寻址
在这种寻址方式中,偏移地址或者说有效地址是直接给出的,是一个用标号或者数字直接给出的具体数值
mov ax,[0x5c0f]
add word [0x0230],0x5000
xor byte [es:label_b],0x05
但凡是表示内存地址的,都必须用中括号括起来
第一条指令中,源操作数使用的是直接寻址方式,当这条指令执行时,处理器将数据段寄存器DS的内容左移4位,加上这里的0x5c0f,形成20位物理地址。接着,从该物理地址处取得一个字,传送到寄存器AX中。
在第二条指令中,目的操作数采用的是直接寻址方式。当这条指令执行时,处理器用同样的方法,访问由段寄存器DS指向的数据段,并把指令中的立即数加到该段中偏移地址为0x0230的字单元里
基址寻址
所谓基址寻址,就是先指定一个基准位置,数据的偏移地址(有效地址)取决于它到基准位置的位移或者说距离(Displacement)。
要使用基址寻址,必须在指令的地址部分使用基址寄存器BX或者BP来提供一个基准地址。
mov [bx],dx
add byte [bx],0x55
第一条指令中的目的操作数采用了基址寻址。
在指令执行时,处理器将数据段寄存器DS的内容左移4位,加上基址寄存器BX中的内容,形成20位的物理地址。然后,把寄存器DX中的内容传送到该地址处的字单元里。
第二条指令中的目的操作数也采用的是基址寻址。
指令执行时,将数据段寄存器DS的内容左移4位,加上寄存器BX中的内容,形成20位的物理地址。然后,将指令中的立即数0x55加到该地址处的字节单元里。
基址寻址的动机是采用“基地址+位移”的方式计算有效地址
在基址寻址方式中,基址寄存器也可以是BP
mov ax,[bp]
这条指令的源操作数采用了基址寻址方式。但是,与前面的指令相比,它采用是基址寄存器BP,在形成20位的物理地址时,默认的段寄存器是SS。也就是说,它经常用于访问栈。
这条指令执行时,处理器将栈段寄存器SS的内容左移4位,加上寄存器BP的内容,形成20位的物理地址,并将该地址处的一个字传送到寄存器AX中
变址寻址
变址寻址类似于基址寻址,唯一不同之处在于这种寻址方式使用的是变址寄存器(或称索引寄存器)SI和DI
mov [si],dx
add ax,[di]
xor word [si],0x8000
和基址寻址一样,当带有这种操作数的指令执行时,除非使用了段超越前缀,处理器会访问由段寄存器DS指向的数据段,偏移地址由寄存器SI或者DI提供。
同样的,变址寻址方式也允许带一个偏移量:
mov [si+0x100],al
and type [di+label_a],0x80
以上第二条指令中,尽管使用的是标号,但本质上属于一个编译阶段确定的数值
基址变址寻址
使用基址变址的操作数可以使用一个基址寄存器(BX或者BP),外加一个变址寄存器(SI或者DI)。
在这种寻址方式下,
- 基址寄存器BX或者BP是固定不变的,是真正作为基地址来使用的
- 变址寄存器SI或者DI是可变的,用来提供位移
它的基本形式是这样的:
mov ax,[bx+si]
add word [bx+di],0x3000
以上,第一条指令的源操作数采用了基址变址寻址。当处理器执行这条指令时,把数据段寄存器DS的内容左移4位,加上基址寄存器BX的内容,再加上变址寄存器SI的内容,共同形成20位的物理地址。然后,从该地址处取得一个字,传送到寄存器AX中。
第二条指令与第一条指令类似,只不过是加法指令,它的目的操作数采用了基址变址寻址,源操作数采用的是立即寻址。这条指令执行时,处理器访问由段寄存器DS指向的数据段,加上由BX和DI相加形成的偏移地址,共同形成20位的物理地址,然后将立即数0x3000加到该地址处的字单元里。
以下是使用基址变址寻址实现的代码,其功能是将一个字符串进行翻转
相关文章:

8086处理器的寻址方式
概念 在计算机系统中,处理器操作和处理的是数值,那么,必定涉及数值从哪里来,处理后送到哪里去,这称为寻址方式(Addressing Mode)。 简单地说,寻址方式就是如何找到要操作的数据,以及如何找到存…...

Mask实现裁剪的原理浅析
简单来说,就是Mask会设置继承了MaskableGraphic的组件的Shader属性,进行特定的模板测试 一张普通的Image,当不挂Mask组件时,其默认Shader的模板缓存属性是这样的 当挂载上Mask时,会改变 Stencil ID变成了1ÿ…...

每隔一秒单片机向电脑发送一个16进制递增数据
SCON0x50 SM00 SM11(工作方式为方式一) REN1允许单片机从电脑接收数据 TB8 RB8 SM2是方式2和方式3直接配置为0 TI为发送中断请求标志位 由硬件配置为1 必须由 软件复位为0,RI为接收中断请求标志位,同理TI UART.c #include &l…...

逆向攻防世界CTF系列56-easy_Maze
逆向攻防世界CTF系列56-easy_Maze 64位无壳,看题目就知道是迷宫问题了 int __fastcall main(int argc, const char **argv, const char **envp){__int64 v3; // raxint v5[7][7]; // [rsp0h] [rbp-270h] BYREFint v6[104]; // [rspD0h] [rbp-1A0h] BYREFv6[52] 1…...

【Linux网络编程】应用层:HTTP协议 | URL | 简单实现一个HTTP服务器 | 永久重定向与临时重定向
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站 🌈个人主页: 南桥几晴秋 🌈C专栏: 南桥谈C 🌈C语言专栏: C语言学习系…...

电压调整电路汇总
目录: 一、LDO 1、LM1117 2、NCV33275 3、TLE42764 4、TPS7B67xx-Q1 5、总结 二、DCDC转换器 1、LM2576与LM2596 2、MC34063 一、LDO 1、LM1117 LM1117 是一款在 800mA 负载电流下具有 1.2V 压降的低压降稳压器。 LM1117 提供可调节电压版本,…...

day28 文件IO及进程线程基础
讨论光标共享情况 1.dup和dup2定义变量赋值都共享光标 2.使用两个描述符调用两次open函数打开同一个文件,不共享光标 #include <myhead.h>int main(int argc, const char *argv[]) {//1、描述符赋值给新的变量char buff[1024] "abcdefg";int ne…...

【Azure 架构师学习笔记】- Azure Function (1) --环境搭建和背景介绍
本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Function 】系列。 前言 随着无服务计算的兴起和大数据环境中的数据集成需求, 需要使用某些轻量级的服务,来实现一些简单操作。因此Azure Function就成了微软云上的一个必不可少的组成部分。 …...
前端文件下载
这里写自定义目录标题 前端文件下载方法使用a标签使用iframe标签二进制流 前端文件下载方法 使用a标签 /*** 文件下载方法 使用a标签* 存在浏览器下载时,太快的话,会取消上次的下载请求* param {*} href* param {*} filename*/ export function downlo…...

前端成长之路:HTML(3)
在HTML中,有列表标签。列表最大的特点是整齐、简洁、有序,用列表进行布局会更加自由方便。根据使用的情景不同,可以将列表分为三大类:无序列表、有序列表和自定义列表。 无序列表 在HTML中使用<ul>标签定义一个无序列表&a…...

无人机自动机库的功能与作用!
一、无人机自动机库的功能 智能停放与管理 无人机自动机库为无人机提供了一个安全、可靠的停放环境。通过先进的感知技术和安全防护措施,它能够实时监测周围环境,确保无人机免受恶劣天气或潜在风险的侵害。 无人机在机库内可以实现智能停放࿰…...

ubuntu 新建脚本shell并增加图标 双击应用实现python运行
1.使用nano创建shell脚本文件 需要在终端窗口中输入“nano”以打开文本编辑器。 nano 在创建脚本文件前,我们要了解脚本文件是如何运行的: 直接运行:直接在终端直接输入需要运行的脚本文件名称,系统或用缺省版本的shell运行脚…...
ANR 分析SOP
遇到ANR问题不要慌,大部分情况下可能是系统or测试手段问题,我们按照如下关键字排查定位 文章目录 1 是否是 heapdump 导致?1.1 dump开始1.2 dump结束 1 是否是 heapdump 导致? 使用 hprof: heap dump 关键词过滤,在d…...

COLA学习之环境搭建(三)
小伙伴们,你们好,我是老寇,上一节,我们学习了COLA代码规范,继续跟老寇学习COLA环境搭建 首先,打开GitHub,搜索 COLA 请给这个COLA项目点个Star,养成好习惯,然后Fork到自…...

CSS输入框动态伸缩动效
前言 下面我们将会做出如下图输入框样式,并且附上组件代码,有特殊需求的可以自行优化同理,下拉框的话只要把el-input标签修改掉即可 MyInput组件 <template><div class"my-input" click.stop"showInput !showInput…...

hbuilder 安卓app手机调试中基座如何设置
app端使用基座 手机在线预览功能 1.点击运行 2.点击运行到手机或者模拟器 3.制作自定义调试基座 4.先生成证书【可以看我上一篇文档写的有】,点击打包 5.打包出android自定义调试基座【android_debug.apk】,【就跟app打包一样需要等个几分钟】 6.点击运行到手…...

探索视觉与语言模型的可扩展性
✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…...
sock_recvmsg函数
sock_recvmsg 是一个在 Linux 内核中用于处理接收网络数据的函数。它通常与套接字 (socket) 操作相关,特别是在网络协议栈中用于处理从网络中接收到的数据。这个函数是内核的一部分,提供了一种机制把接收到的数据从网络协议栈转移到用户空间,或者在内核内进一步处理。 以下是…...

HCIA笔记8--DHCP、Telnet协议
1. DHCP介绍 对于主机的网络进行手动配置,在小规模的网络中还是可以运作的,但大规模网络是无力应对的。因此就有了DHCP协议来自动管理主机网络的配置。 DHCP(Dynamic Host Configuration Protocol): 动态主机配置协议,主要需要配置的参数有…...
Scala的单例对象
在Scala中,单例对象是一种特殊的类,它只能有一个实例,并且这个实例在需要时会自动创建。单例对象在Scala中通过object关键字来定义,它类似于Java中的静态成员和方法,但更加灵活和强大。 定义单例对象 以下是定义一个…...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...

Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...