速通汇编(七)BX、SI、DI寄存器,BP寄存器,直接寻址和间接寻址

news2024/11/16 19:41:58

下文中出现的"idata",指的都是任意常量

一,基于BX、SI、DI等寄存器的寻址形式

在第五篇中曾介绍过DS寄存器的作用,简要复习一下->速通汇编(五)认识段地址与偏移地址,CS、IP寄存器和jmp指令,DS寄存器_arm汇编 前两个地址是什么-CSDN博客

可以如此说:汇编中出现的形如[偏移地址]形式的地址,指的都是[DS:偏移地址],即DS*16+偏移地址处的内存

为了更灵活的使用这个语法,CPU提供了BX、SI、DI等寄存器来方便我们表达[偏移地址]

(一)[bx+idata]

BX原名是“基址寄存器”,当需要使用[偏移地址]这个语法时,可以将BX中的数据作为这里的偏移地址,写作[bx+idata]AX、CX、DX等寄存器是不能这样写的!),它代表的意思很清晰:指的就是DS*16+BX+idata处的内存

 

下图演示idata==0

下图演示idata==2

(二)[si/di+idata]

si和di各自都可以单独使用成[偏移地址]这个语法,即[si+idata][di+idata]

其效果与[bx+idata]是一模一样的

这里简略带过,读者自行验证

(三)[bx+si/di+idata]

[bx+si+idata][bx+di+idata]

这个语法让[偏移地址]这个语法的表达更加灵活,但本质都是一样的

无非是各种寄存器和一个常数加起来组成一个偏移地址罢了,下面简单做个实验验证语法

修改DS==2000,BX==1000,SI==0003,DI==0006

写入汇编【mov ax,[bx+si]】【mov cx,[bx+di]】【mov dx,[bx+si+3]

先预测结果:ds==2000,bx+si==1000+0003==1003,因此ax的值应该取地址[2000:1003]处的数据,其余两条汇编同理

故ax==5566,cx==2233,dx==2233

执行完后,结果符合预期

注意,以下表示[偏移地址]的语法是错误的

[bx+si+di+idata]        ×si和di各自都能和bx组合,但不可以同时出现

[bx+ax/cx/dx]            ×虽然bx和ax/cx/dx都是常用寄存器,但只有bx可以出现在[偏移地址]这个语法中

(四)总结

(1)[idata]用一个常量来表示地址,可用于直接定位一个内存单元

(2)[bx]用一个变量来表示内存地址,可用于间接定位一个内存单元

(3)[bx+idata]用一个变量和常量表示地址,可在一个起始地址的基础上用变量间接定位一个内存单元
(4)[bx+si/di]用两个变量表示地址
(5)[bx+si/di+idata]用两个变量和一个常量表示地址


二,BP寄存器

说明完BX、SI、DI的各种组合寻址之后,BP寄存器就非常容易解释了

在寻址功能这块,你可以把BP和BX看成亲戚

[bp+idata]≈[bx+idata]

[bp+si/di+idata]≈[bx+si/di+idata]

说是“亲戚”的原因,在于它们寻址的差别在段地址上

BX寄存器基于这种寻址方式时,默认的段地址取的是DS寄存器中的数据,这一点在上面已经验证过

BP寄存器基于这种寻址方式时,默认的段地址取的是SS寄存器中的数据

SS寄存器在上一篇介绍栈时已经阐明,它配合SP寄存器指向的其实是一段被视作“栈”的内存空间,下面进行简单实验验证

①写入并执行以下汇编指令,并查看栈中数据

执行前

执行后,ax,bx,cx的值被压入栈中,按照从高地址(栈底)向低地址(栈顶),这里解释算复习上篇的内容了

 

②现在先思考一下,如果想要用形如[bp+si/di+idata]的语法取到栈中的数据放入AX中,例如[073F:00F9]处的内容,该如何编写汇编?

答案很多,因为这个表达式很灵活,总之凑出中括号[]中的内容等于[00F9]即可,CPU会将其用作偏移地址,将此时SS(而不是DS)的073F用作段地址

例如bp和di的组合

bp+di+3==00F0+0006+3==00F9


三,寻址方式总结

(注:本图取自《王爽汇编》P165处表8.2,不商用,仅供学习参考。)

下图表格中第4列【常用格式举例】中出现的一些特殊表示形式

如[bx].idata,[bx][idata],[bx].idata[si],都是[偏移地址]的特殊形式,其本质都是相加

如[bx].idata==[bx+idata],[bx][idata]==bx+idata,[bx].idata[si]==bx+idata+si

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

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

相关文章

oracle avg、count、max、min、sum、having、any、all、nvl的用法

组函数 having的使用 any的使用 all的使用 nvl 从执行结果来看,nvl(列名,默认值),nvl的作用就是如果列名所在的这一行出现空则用默认值替换

3.2 USART 通用同步/异步收发器

文章目录 什么是USARTUSART框图 stm32的Usart串口收发配置初始化发送接收 重定向的几种方法串口发送数据包 什么是USART USART(Universal Synchronous/Asynchronous Receiver/Transmitter)通用同步/异步收发器USART是STM32内部集成的硬件外设&#xff0…

[Unity Demo]从零开始制作空洞骑士Hollow Knight第十集:制作后坐力系统Recoil和小骑士的生命系统和受伤系统

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、制作后坐力系统Recoil 1.使用代码实现扩展新的后坐力行为2.为敌人脚本添加后坐力行为3.为小骑士添加后坐力行为二、制作小骑士的生命系统和受伤系统 1.制作…

Appium独立测试自动化初始化脚本

1、查看环境初始化参数 确保appium已经开起来了,设置ip ,并点击启动 打开夜神模拟器,点击工具--设置 最下面的版本说明,双击进去 版本号这里再去单击。 直到进入到开发者模式。 可能我们不是开发者模式打开的状态,所以软件访问模…

fo-dicom是如何实现DICOM 的网络通信功能

一、前言 前面的文章,我们介绍了fo-dicom是一个怎样的开源库等一些内容: fo-dicom,第一个基于.NET Standard 2.0 开发的DICOM开源库fo-dicom开源库是如何满足 DICOM标准的基本要求fo-dicom开发之DICOM数据解析:常见数据类型及处…

自学前端的正确姿势是...

师傅带进门,修行在个人。 在前端自学成才的道路上,有些人走的很快,有些人却举步维艰。 为什么会这样子呢?因为他们没有掌握自学前端的正确姿势。 在介绍应该要怎样自学前端之前,首先来看下,自学前端容易…

JavaWeb--小白笔记07:servlet对表单数据的简单处理

这里的servlet对表单数据的处理是指使用IDEA创建web工程,再创建html和class文件进行连接,实现html创建一个表单网页,我们对网页中的表单进行填充,可以通过class文件得到网页我们填充的内容进行打印到控制台。 一登录系统页面---h…

[vulnhub] w1r3s.v1.0

https://www.vulnhub.com/entry/w1r3s-101,220/ 思路:红队笔记 主机发现端口扫描 使用nmap扫描网段类存活主机 因为靶机是我最后添加的,所以靶机IP是133 nmap -sP 192.168.75.0/24 // Starting Nmap 7.93 ( https://nmap.org ) at 2024-09-20 09:09 CST…

MySQL 数据库安装(详细教程)

文章目录 一、前言二、下载 MySQL2.1 安装包方式2.2 压缩包方式(推荐) 三、安装 MySQL3.1 解压 MySQL 文件3.2 配置环境变量3.3 初始化 data 目录3.4 安装 MySQL 服务3.5 开启 MySQL 服务3.6 修改 MySQL 密码 四、卸载 MySQL4.1 停止 MySQL 服务4.2 删除…

MySQL record 08 part

数据库连接池: Java DataBase Connectivity(Java语言连接数据库) 答: 使用连接池能解决此问题, 连接池,自动分配连接对象,并对闲置的连接进行回收。 常用的数据库连接池: 建立数…

【WRF运行第三期】服务器上运行WRF模型(官网案例-Hurricane Matthew)

【WRF运行第三期】运行WRF模型(官网案例-Hurricane Matthew) 官网案例-Hurricane Matthew介绍0 创建DATA文件夹1 WPS预处理1.1 解压GRIB数据(ungrib.exe)1.1.1 解压GRIB数据---GFS(Matthew案例研究数据)1.1…

Bytebase 2.22.3 - 一键回滚 PostgreSQL DML 变更

🚀 新功能 支持一键回滚 PostgreSQL DML 变更。 🎄 改进 优化 DML 事前备份和回滚体验: 引导用户创建 bbdataarchive 数据库。如果没有 bbdataarchive 数据库,无法开启备份功。用户现在可以在创建工单之后开启或关闭备份功能&a…

PyCharm远程连接AutoDL服务器实现程序调试

本文详细介绍了如何在Pycharm中配置SSH和SFTP,以便于在AOTUDL服务器上进行代码修改、调试。步骤包括新建工程、配置SFTP连接、设置Rootpath和Mapping,以及实现自动上传和下载文件的功能。远程服务器编辑调试只是试用于专业版本的pycharm,我的…

【LLM学习之路】9月22日 第九天 自然语言处理

【LLM学习之路】9月22日 第九天 直接看Transformer 第一章 自然语言处理 自然语言处理发展史 只要看的足够多,未必需要理解语言 统计语言模型发展史 统计语言模型: 判断一个句子是否合理,就计算这个句子会出现的概率 缺点是句子越长越…

微软推迟在MDM设备上启用OOBE强制更新 因为IT管理员反馈称缺乏控制

微软很久之前就计划在 Windows 10/11 OOBE 期间强制下载更新,即若检测到系统本身属于旧版本例如并未安装最新累积更新,则在 OOBE 期间强制下载最新累积更新并自动安装。这种更新方式已经在面向消费者的设备上启用,而上周微软则是在适用于企业…

盘点那些功能强大的思维导图在线工具,你用过几个

如果我们日常遇到比较繁杂的信息需要梳理,那我比较推荐使用思维导图在线工具进行梳理。这些工具可以通过图形化的方式展示各种信息之间的关系。这篇文章我将要介绍几款好用的思维导图工具帮我们更好的组织思维。 1.福晰思维导图 链接一下:https://www.…

GPIO与MIO控制LED——ZYNQ学习笔记2

一、GPIO简介 ZYNQ 分为 PS 和 PL 两部分,那么器件的引脚( Pin)资源同样也分成了两部分。 ZYNQ PS 中的外设可以通过 MIO( multiplexed I/O,多路复用 I/O)模块连接到 PS 端的引脚上,也可以通过 …

HTML讲解(三)通用部分

目录 1.空格标记 2.特殊文字的标记 3.注释语句 4.对文字字体的设置 5.修改文字形态 6.换行标记 7.居中标记 8.水平线标记 9.设置滚动弹幕 1.空格标记 在HTML中,我们想打印空格并不能直接敲一个空格键,因为如果是敲空格键,那无论你敲…

【JUC并发编程系列】深入理解Java并发机制:Volatile从底层原理解析到高级应用技巧(六、Volatile关键字、JMM、重排序、双重检验锁)

文章目录 【JUC并发编程系列】深入理解Java并发机制:Volatile从底层原理解析到高级应用技巧(六、Volatile关键字、JMM、重排序、双重检验锁)1. Volatile的特性2. Volatile的用法3. CPU多核硬件架构剖析4. JMM内存模型4.1 主要特性4.2 JMM 的工作原理4.3 实现机制 5.…

Leetcode面试经典150题-39.组合总数进阶:40.组合总和II

本题是扩展题,真实考过,看这个题之前先看一下39题 Leetcode面试经典150题-39.组合总数-CSDN博客 给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数…