80x86汇编—寻址方式

news2025/1/26 15:35:08

文章目录

  • 术语解释
  • 8086寻址方式
    • 直数寻址
    • 寄存器间接寻址
    • 寄存器相对寻址
    • 基址变址寻址
    • 比例变址寻址方式
    • 基址比例变址寻址方式

术语解释

  • EA:有效地址,通过段地址:偏移地址组合得到的Effect Address

  • 位移量:一般是常量和标号,比如某个数据段首地址是ARR标号,那我们就可以直接写标号ARR找到数据段首地址。

  • 基地址:BX、BP寄存器一般作为基地址

    很有意思的是,我一开始以为基地址段地址,因为我一直觉得段地址是老大,我们偏移地址才是小弟,所以我们都以他为基准就以为段地址是基地址了,但其实不是的,BX和BP可以作为基地址, 基地址的意思是在偏移地址中能够作为一个基准,比如你MOV了一个地址进BX里面,我们寻址的时候可以用上基地址寻址以BX为基准,不用修改它,然后使用变址寄存器来改变。(下面会提到变址)

  • 变址量:一般是SI、DI作为变址寄存器去改变地址值,就好像数组的下标一样。

  • 比例因子:这位就好笑了,其实就是乘一个数字,一般是1,2,4,8,因为计算机就是用这几个进制,而且比例因子出现是因为我们可以通过比例因子乘以变址寄存器跳着找地址。比如SI * 4就是希望每次SI改变的时候地址能够以4的倍数跳着寻址。

  • 细节:后面提到段地址其实我们寻址方式不涉及段地址,所以当时学的时候不清楚才导致我不理解基地址寻址连带后面的寻址方式也搞错了。
    其次,寻址中可以不写出段地址,但是需要的时候就要指明。(后面会详细解释什么时候需要特地指明)


上面没懂没关系,这里解释我也是学完了才补上的。

8086寻址方式

直数寻址

  • 立即数寻址
    MOV AX, DS:[0110H]
  • 标号寻址
    MOV AX, 标号,比如我们定义了一个叫做data的数据段,那就可以直接将data作为标号寻址到这段数据的地址。

寄存器间接寻址

MOV AX, [SI]
MOV AX, [DI]
MOV AX, [BX]
MOV AX, [BP]
MOV [SI], AX
上面多种多样都可以,但是唯独AX不可以作为寄存器寻址,验证时候,debug中错误提示是说:must be index or base reg ,所以我就把他理解为AX不是下标寄存器或者基址寄存器。
在这里插入图片描述

寄存器相对寻址

相对寻址就是有一个标号或者固定一个常量地址作为首地址然后使用变址寄存器,这里很容易和基地址寻址方式搞混,基地址那个是使用寄存器,这里是使用常量和标号(其实标号就是常量,编译器执行完后就是常量了)
这里设:ARR为标号地址
MOV AX, ARR[SI] ,这里ARR后面没有冒号不是段地址,不要搞混了,而且debug中会看到是等于 EA = [ARR + SI]
其实也可以这样写:MOV AX,[ARR + SI],但是寄存器相对寻址这个名字既然起了咱就规规矩矩用,按照规矩来其实才是实战中最好用的
当然不止可用SI,DI也可以用,BP也可以用,但是这里的MOV AX, ARR[SI] 默认是DS段
如果你要用BP,请记住如果不指名段地址,BP默认的段地址是SS栈段。

在这里插入图片描述
可以看到没有指明和指明的段地址是不同的
38h[bp][si]中其实等于[BP + SI + 38h],不信的话也可以看到图中,debug出来的地址就是[BP + SI + 38h]

基址变址寻址

为什么不说基址?
好,我说,MOV AX,[BP],这就是基址寻址,这tm跟寄存器间接寻址没啥区别。
为啥不说变址寻址?
好,我再说,MOV AX,[SI],这就是你要的变址寻址,这特喵跟寄存器间接寻址有啥区别。
所以,还是学基址变址寻址
这里设:ARR是一个标号,假设ARR地址等于1010H
MOV AX, ARR[BP][SI]
也可以MOV [BP][DI], AX,不止只有源操作数才可以使用这种寻址方式
看到BP,并且没有指明段地址,那我们这条指令的段地址是SS。
基址是BP,变址是SI,组合起来就是基址变址寻址方式,
实质上这条debug后是等于:[BP + SI + 1010H],当然ARR会变成地址数值。

比例变址寻址方式

这个用途就是:假设我们的数据段每一个数据都是占好几个字的时候比如我们一个元素就占4个字,我们变址形式可以每次都加+4,但是这太麻烦了, 我们直接SI * 4,每次SI只需要增加1就完成了跳跃性的寻址,不用SI每次加4这么麻烦。
首先抓住字眼,比例+变址,那就是使用变址寄存器和比例因子就行了
MOV AX, ARR[SI * 4]
这个指令实质是等于:[ARR + SI * 4],SI * 4这里debug中一般都会帮你计算出来结果放在[ this ]里面。

基址比例变址寻址方式

学到这时候,我直接把书本撕掉,选择自己写。
我猜指令格式一定是:MOV AX, ARR[BP][SI*4]
没有书本了,那就看PPT截图答案,他的TABLE和我的ARR意思是一样的,只是一个标号,EBP是32位寄存求,我这里使用了16位寄存器,EBP和BP一样,默认段寄存器是SS,所以我是猜对了,希望复习的我以后还能继续猜对…
在这里插入图片描述


总结:最反人类的其实是相对寻址格式是 ARR[SI],这个样子实在是很基址寻址,因为基地址就是找一个基准,这里的相对寻址的ARR太像一个基地址杵在那里,但是后面转念一想,ARR作为标号就是一个地址,不是寄存器不能作为基准,这句话只可意会不可言传,我也不知道怎么说,总之我们基地址需要一个寄存器来表示,所以后面学习基址变址寻址方式的时候我才恍然大悟说原来基地址是需要一个寄存器作为基准。
还有一个让我掉大坑的是:我一直以为段地址是基址寻址方式,但是我们这里用的都是在段内的,我后知后觉,现在才搞懂,一切都是因为ARR这个长得太像基地址了,搞得我以为CS:IP这种才是基地址寻址方式。
学到这里,虽然说很反人类,其实想到指令系统的话,他甚至没有给你很明确的细分什么什么方式之类的,更头痛,有人帮你分类号这种是什么寻址方式其实更容易让我学习了。
总之,希望我以后不会再搞混了…

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

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

相关文章

HTTP前端请求

目录 HTTP 请求1.请求组成2.请求方式与数据格式get 请求示例post 请求示例json 请求示例multipart 请求示例数据格式小结 3.表单3.1.作用与语法3.2.常见的表单项 4.session 原理5.jwt 原理 HTTP 请求 1.请求组成 请求由三部分组成 请求行请求头请求体 可以用 telnet 程序测…

解决xcode 运行不老iPhone 15 iOS 17.1 设备的问题

问题 最近要查看一下ios 17.1的设备的性能,但是当前版本的Xcode运行不了 解决方法 1、更新Xcode版本到15.1以上 2、更新完成后,大概率出现这个情况 原因:在app Store中更新到Xcode15后,运行不了模拟器和真机.需要下载iOS 17对应的模拟器.&…

力扣每日一题day38[106. 从中序与后序遍历序列构造二叉树]

给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7], postorder [9,15,7,20,3] 输出:[…

Java 面试 多线程遇到的问题,如何处理

问题描述 某服务在运行过程中抛出了 RejectedExecutionException。 配置参数: corepoolsize 50, maxpoolsize 50, workqueue 为 SynchronousQueue 现象: 当新的task被拒绝时,pool size未达到配置值50. Caused by: java.util.conc…

dotnet命令创建C#项目,VSCode打开

在命令行中创建项目并运行 1.首先安装.net 下载地址:.NET | 构建。测试。部署。 2.在 cmd 控制台输入 dotnet --vesion 检查版本号是否正常 3.我用git bash环境输入命令创建项目 // 创建文件夹 mkdir MyVSCode // 进入该文件夹 cd MyVSCode/ // 创建控制台项目 dotnet …

java类和对象的思想概述

0.面向对象Object OOP——名人名言:类是写出来的,对象是new出来的 **> 学习面向对象的三条路线 java类以及类成员:(重点)类成员——属性、方法、构造器、(熟悉)代码块、内部类面向对象特征&…

【音视频】Mesh、Mcu、SFU三种框架的总结

目录 三种网络场景介绍 【Mesh】 【MCU】(MultiPoint Control Unit) 【SFU】(Selective Forwarding Unit) 三种网络架构的优缺点 Mesh架构 MCU架构(MultiPoint Control Unit) SFU架构(Selective Forwarding Unit) 总结 参考文章 三种网络场景介绍 【Mesh】 Mesh架构…

<软考高项备考>《论文专题 - 24 整合管理(2) 》

3 过程2-制订项目管理计划 3.1 问题 4W1H过程1-制定项目章程做什么定义、准备和协调项目计划的所有组成部分,并把它们整合为一份综合项目管理计划的过程;作用:生成一份综合文件,用于确定所有项目工作的基础及其执行方式为什么做…

大创项目推荐 深度学习+python+opencv实现动物识别 - 图像识别

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络3.1卷积层3.2 池化层3.3 激活函数:3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 inception_v3网络5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 *…

Uniapp 开发 BLE

BLE 低功耗蓝牙(Bluetooth Low Energy,或称Bluetooth LE、BLE,旧商标Bluetooth Smart),用于医疗保健、运动健身、安防、工业控制、家庭娱乐等领域。在如今的物联网时代下大放异彩,扮演者重要一环&#xff…

互联网账户一证通查询名下账号

核验身份后一键在线查询名下所有关联号码以及注册。 名下电话卡查询:全国移动电话卡“一证通查” 手机号绑定查询:https://tb3.cn/A3lhMk

Wavesurfer.js绘制波形图

HTML使用Wavesurfer.js 要使用wavesurfer.js,首先需要在HTML文件中引入Wavesurfer.js库,然后创建一个音频元素并将其添加到页面中。接下来,初始化Wavesurfer实例并配置相关选项。以下是一个简单的示例: 在HTML文件中引入Wavesurf…

一款外置MOS开关降压型 LED 恒流控制器应用方案

一、基本概述 TX6121 是一款高效率、高精度的降压型大功率 LED 恒流驱动控制器芯片。芯片采用固定关断时间的峰值电流控制方式,关断时间可通过外部电容进行调节,工作频率可根据用户要求而改变。 通过调节外置的电流采样电阻,能控制高亮度 LE…

【Linux笔记】用户和权限管理基本命令介绍

🍎个人博客:个人主页 🏆个人专栏:Linux学习 ⛳️ 功不唐捐,玉汝于成 目录 ​编辑 前言: 命令: whoami: passwd: useradd: userdel: chm…

深度学习数据处理(一)

在PyTorch中,torch.Tensor是存储和变换数据的主要工具。如果你之前用过NumPy,你会发现Tensor和NumPy的多维数组非常类似。然而,Tensor提供GPU计算和自动求梯度等更多功能,这些使Tensor更加适合深度学习。 张量(tensor&…

Linux内核模块文件组成介绍

Linux驱动开发主要的工作就是编写模块,一个典型的Linux内核模块文件.ko 主要由以下几个部分组成。 模块加载函数(必须) 当通过insmod或modprobe命令加载内核模块时,模块的加载函数会自动被内核执行,完成本模块的相关初始化工作。 Linux内核模…

js显示实时时间

文章目录 一、效果二、思路三、最后 一、效果 用JS实现XXXX年XX月XX日 星期X XX时XX分XX秒 效果 效果 &#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>time</title><script t…

【数据结构】队列的使用|模拟实现|循环队列|双端队列|面试题

一、 队列(Queue) 1.1 概念 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出FIFO(First In First Out) 入队列&#xff1a;进行插入操作的一端称为队尾&#xff08;Tail/Rear&#xff09; 出队列…

nodejs微信小程序+python+PHP兴趣趣班预约管理系统设计与实现-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

webpack学习-7.创建库

webpack学习-7.创建库 1.暴露库1.1概念1.2验证1.2.1 不导出方法1.2.2 导出方法 2.外部化 lodash3.外部化的限制4.最终步骤5.使用自己的库5.1坑 6.总结 1.暴露库 这个模块学习有点坑。看名字就是把自己写的个包传到npm&#xff0c;而且还要在项目中使用到它&#xff0c;支持各种…