当前位置: 首页 > news >正文

【汇编】[bx+idata]的寻址方式、SI和DI寄存器

文章目录

  • 前言
  • 一、[bx+idata]寻址方式
    • 1.1 [bx+idata]的含义
    • 1.2 示例代码
  • 二、SI和DI寄存器
    • 2.1 SI和DI寄存器是什么?
    • 2.2 [bx+si]和[bx+di]方式寻址
    • 2.3 [bx+si+idata]和[bx+di+idata]
  • 总结


前言

在汇编语言中,寻址方式是指指令如何定位内存中的数据。BX寄存器与偏移量(idata)的结合,即[BX+idata]寻址方式,是一种常见的寻址方式。同时,SI(Source Index)和DI(Destination Index)寄存器在字符串操作中扮演着重要的角色。本文将深入研究这两个方面,旨在帮助读者更好地理解在汇编语言中是如何定位和操作内存中的数据的。

[BX+idata]的寻址方式:

在汇编语言中,[BX+idata] 是一种寻址方式,其中BX是基址寄存器,idata是一个立即数偏移。这种寻址方式的具体操作如下:

从BX寄存器中取得一个地址。
将这个地址与idata相加,得到最终的内存地址。
访问该内存地址中的数据。
这种寻址方式通常用于数组和结构体等数据结构的访问,BX提供了数组或结构体的基址,而idata提供了相对于基址的偏移。

SI和DI寄存器:

SI寄存器(Source Index):

SI寄存器常用于字符串和数组的操作。在字符串复制或比较等操作中,SI通常指向源数据的起始位置。
操作系统和编程语言通常约定好使用SI寄存器来处理源数据。
DI寄存器(Destination Index):

DI寄存器同样常用于字符串和数组的操作。在字符串复制时,DI通常指向目标数据的起始位置。
DI寄存器通常用于指定写入数据的目标位置。


一、[bx+idata]寻址方式

1.1 [bx+idata]的含义

[bx+idata]表示一个内存单元,它的偏移地址为(bx)+idata(bx中的数值加上idata)。
mov ax,[bx+200] / mov ax, [200+bx] 的含义
将一个内存单元的内容送入ax
这个内存单元的长度为2字节(字单元),存放一个字
内存单元的段地址在ds中,偏移地址为200加上bx中的数值
数学化的描述为: (ax)=((ds)*16+200+(bx))
指令mov ax,[bx+200]的其他写法(常用)

mov ax,[200+bx]
mov ax,200[bx]
mov ax,[bx].200

在这里插入图片描述
有了[bx+idata]这种表示内存单元的方式,我们就可以用更高级的结构来看待所要处理的数据。

弟子想到了C语言中的数组

1.2 示例代码

用[bx+idata]的方式进行数组的处理
问题:在codesg中填写代码,将datasg中定义的
第一个字符串,转化为大写
第二个字符串转化为小写。

assume cs:codesg,ds:data
codesg segmentdata segmentdb 'BaSic'db 'iNfOrMaTiOn'
data endsstart:  mov ax,datasgmov ds,axmov bx,0mov cx,5s: mov al,[bx]and al,11011111bmov [bx],alinc bxloop smov bx,5mov cx,5s0: mov al,[bx]or al,00100000bmov [bx],alinc bxloop s0mov ax,4c00hint 21hcodesg ends
end start

这段汇编代码的作用是处理一个包含字符串 “BaSic iNfOrMaTiOn” 的内存区域。现在,我会用通俗易懂的语言逐步解释这段代码的主要部分:

1.数据段定义:

data segment
db ‘BaSic’
db ‘iNfOrMaTiOn’
data ends

在这里,我们定义了一个数据段 data,其中包含两个字符串片段,分别是 ‘BaSic’ 和 ‘iNfOrMaTiOn’。

2.数据移动和处理:

mov ax, datasg
mov ds, ax
mov bx, 0
mov cx, 5
s: mov al, [bx]
and al, 11011111b
mov [bx], al
inc bx
loop s

这部分代码的作用是将字符串中的大写字母转换为小写。通过循环遍历字符串,每次取出一个字符,使用 and 操作将ASCII码中的高位置0,从而将大写字母转换为小写字母。

3.数据移动和处理的第二部分:

mov bx, 5
mov cx, 5
s0: mov al, [bx]
or al, 00100000b
mov [bx], al
inc bx
loop s0

这一部分代码的作用是将字符串中的小写字母转换为大写。同样通过循环遍历字符串,每次取出一个字符,使用 or 操作将ASCII码中的指定位设为1,从而将小写字母转换为大写字母。

4.程序结束:

mov ax, 4c00h
int 21h

最后的部分是程序的结束。通过 mov ax, 4c00h 将程序结束的指令存储在寄存器 ax 中,然后通过 int 21h 中断调用,正常地退出程序。
综合起来,这段代码的主要功能是将给定字符串中的大写字母转换为小写,同时将小写字母转换为大写,然后正常地结束程序。

二、SI和DI寄存器

2.1 SI和DI寄存器是什么?

在汇编语言中,SI(Source Index)和DI(Destination Index)寄存器通常用于字符串操作。让我们用通俗易懂的语言来解释它们:

SI 寄存器(Source Index):

直译: “源索引”
比方说: 想象你有一本书,你要找一段文字的起始位置。SI 就像是你在书中的索引,告诉你这段文字在哪里。
DI 寄存器(Destination Index):

直译: “目标索引”
比方说: 现在你想在另一本书里找到相同的文字,并且要从这本书的某一页开始写下来。DI 就像是你在另一本书中的索引,告诉你从哪里开始写。
在字符串操作中,SI 通常用于指向源字符串的起始位置,而 DI 用于指向目标字符串的起始位置。例如,当你想把一个字符串复制到另一个地方时,SI 就是原始字符串的起点,DI 是要复制到的目标地点。这两个寄存器的值会在操作过程中不断地增加,以便逐步处理字符串的每个字符。

2.2 [bx+si]和[bx+di]方式寻址

[bx+si]表示一个内存单元
偏移地址为(bx)+(si)(即bx中的数值加上si中的数值)。
指令mov ax,[bx+si]的含义
将一个内存单元的内容送入ax
这个内存单元的长度为2字节(字单元),存放一个字
偏移地址为bx中的数值加上si中的数值
段地址在ds中
指令mov ax,[bx+si]的数学化的描述
(ax)=( (ds)*16+(bx)+(si) )
mov ax,[bx+si]的其他写法
mov ax,[bx][si]

在这里插入图片描述

2.3 [bx+si+idata]和[bx+di+idata]

[bx+si+idata]和[bx+di+idata]方式指定地址
[bx+si+idata]表示一个内存单元
偏移地址为(bx)+(si)+idata,即bx中的数值加上si中的数值再加上idata
指令mov ax,[bx+si+idata]的含义
将一个内存单元的内容送入ax
这个内存单元的长度为2字节(字单元),存放一个字
偏移地址为bx中的数值加上si中的数值再加上idata,段地址在ds中

数学化的描述
(ax)=( (ds)*16+(bx)+(si)+idata )
指令mov ax,[bx+si+idata]的其他写法

mov ax,[bx+200+si]
mov ax,[200+bx+si]
mov ax,200[bx][si]
mov ax,[bx].200[si]
mov ax,[bx][si].200
mov ax,[bx][si]

总结

在本文中,我们深入研究了在汇编语言中的两个重要概念:[BX+idata]寻址方式以及SI和DI寄存器。[BX+idata]寻址方式提供了一种灵活的方式来访问内存中的数据,特别适用于数组和结构体的操作。而SI和DI寄存器在字符串和数组处理中发挥着关键的作用,分别指向源数据和目标数据的起始位置,使得汇编语言能够有效地进行字符串操作,如复制、比较等。通过深入理解这些概念,读者将更好地理解汇编语言中的内存寻址和字符串处理的原理。

相关文章:

【汇编】[bx+idata]的寻址方式、SI和DI寄存器

文章目录 前言一、[bxidata]寻址方式1.1 [bxidata]的含义1.2 示例代码 二、SI和DI寄存器2.1 SI和DI寄存器是什么?2.2 [bxsi]和[bxdi]方式寻址2.3 [bxsiidata]和[bxdiidata] 总结 前言 在汇编语言中,寻址方式是指指令如何定位内存中的数据。BX寄存器与偏…...

Java,集合框架,关于Map接口与Collections工具类

目录 Map接口 Map及其实现类的对比: HashMap中元素的特点: 相关方法: 添加、修改操作: 删除操作: 元素查询的操作: 元视图操作的方法: TreeMap的使用: Properties类: Collections工具…...

【实用技巧】更改ArduinoIDE默认库文件位置,解放系统盘,将Arduino15中的库文件移动到其他磁盘

本文主要介绍更改Arduino IDE (含2.0以上版本)默认库文件位置的方法。 原创文章,转载请注明出处: 【实用技巧】更改ArduinoIDE默认库文件位置,解放C盘,将Arduino15中的库文件移动到其他磁盘-CSDN博客文章浏…...

二、什么是寄存器

目录 一、STM32芯片架构简图及系统框图 1.1 STM32芯片架构简图 1.1.1 FLASH是什么,用来做什么 1.1.2 SRAM是什么,用来做什么 1.1.3 片上外设是什么,用来做什么 1.2 系统框图 1.2.1 驱动单元 1.2.2 被动单元 二、什么是寄存器 2.1 存…...

邀请报名|11月24日阿里云原生 Serverless 技术实践营 深圳站

活动简介 “阿里云云原生 Serverless 技术实践营 ” 是一场以 Serverless 为主题的开发者活动,活动受众以关注 Serverless 技术的开发者、企业决策人、云原生领域创业者为主,活动形式为演讲、动手实操,让开发者通过一个下午的时间增进对 Ser…...

学习UI第一天

在工作闲暇之余,自己画的原型图,再次做一次记录,哈哈哈 萌宠领养UI设计原型图 https://modao.cc/proto/lq2KqIVBs48xwylNZlA7OP/sharing?view_moderead_only #萌宠领养-分享 可以点击此链接,进行查看O(∩_∩)O哈哈~...

1688商品详情原数据(2023年11月最新版)

返回数据&#xff1a; 请求链接 {"item": {"desc_wdescContent": {"itemProperties": [],"offerId": "705844836943","wdescContent": {"content": "<div id\"offer-template-0\"&g…...

CleanMyMac X2024免费测试版好不好用?值不值得下载

如果你是一位Mac用户&#xff0c;你可能会遇到一些问题&#xff0c;比如Mac运行缓慢、磁盘空间不足、应用程序难以管理等。这些问题会影响你的Mac的性能和体验&#xff0c;让你感到沮丧和无奈。那么&#xff0c;有没有一款软件可以帮助你解决这些问题呢&#xff1f;答案是肯定的…...

Linux操作文件的底层系统调用

目录 1.概述 2.open的介绍 3.write 的介绍 4.read 5.close的介绍 6.文件描述符 1.概述 C语言操作文件的几个库函数:fopen,fread,fwrite,fclose; 系统调用:open,read,write,close; 系统调用方法实现在内核中;(陷入内核,切换到内核) 2.open的介绍 open重载:两个参数用于打…...

steam搬砖项目2023年现状分析,到底还能不能做?

关于CSGO游戏搬砖项目的5大认知误区 当前的steam搬砖项目市场正变得混乱不堪。你对该项目的了解程度决定了你是否能在这个生态系统中获得收益。 假设你有100万资金&#xff0c;想要全部投入搬砖事业&#xff0c;但对项目一无所知&#xff0c;只看中收益。即使你有充足的资金&a…...

【论文阅读】基于隐蔽带宽的汽车控制网络鲁棒认证(二)

文章目录 第三章 识别CAN中的隐藏带宽信道3.1 隐蔽带宽vs.隐藏带宽3.1.1 隐蔽通道3.1.2 隐藏带宽通道 3.2 通道属性3.3 CAN隐藏带宽信道3.3.1 CAN帧ID字段3.3.2 CAN帧数据字段3.3.3 帧错误检测领域3.3.4 时间通道3.3.5 混合通道 3.4 构建信道带宽公式3.5通道矩阵3.6 结论 第四章…...

string类的常用方法

string类是C中一个非常常用的类&#xff0c;它提供了许多方法来操作字符串。以下是一些常用的string类方法&#xff1a; 构造函数: string(): 创建一个空的字符串。 string(const char* str): 用一个C风格字符串来初始化一个新的字符串。string(size_t n, char c): 创建一个由…...

Java面向对象(高级)-- 单例(Singleton)设计模式

文章目录 一、单例设计模式&#xff08;1&#xff09; 设计模式概述&#xff08;2&#xff09; 何为单例模式&#xff08;3&#xff09; 实现思路&#xff08;4&#xff09; 单例模式的两种实现方式1. 饿汉式2. 懒汉式3. 饿汉式 vs 懒汉式 &#xff08;5&#xff09; 单例模式的…...

【Kingbase FlySync】命令模式:安装部署同步软件,实现Oracle到KES实现同步

【Kingbase FlySync】命令模式:安装部署同步软件&#xff0c;实现Oracle到KES实现同步 一.准备工作二.环境说明三.目标四.资源虚拟机 五.实操(1).准备安装环境Orcle服务器(Oracle40)1.上传所有工具包2.操作系统配置a.增加flysync 用户、设置密码b.配置环境变量c.调整limits.con…...

2311d导入c的语义不同

原文 以下D代码正常工作: enum X "X"; import core.stdc.stdio; void main(){puts(X); }但是,如果该X枚举是C文件中#define的结果,则会出现错误: //x.c #define X "X" //D代码 import x; import core.stdc.stdio; void main(){puts(X); //错误 }错误:不…...

OpenHarmony Meetup北京站招募令

OpenHarmony Meetup城市巡回北京站火热来袭&#xff01;&#xff01;日期&#xff1a;2023年11月25日14:00地点&#xff1a;中国科学院软件园区五号楼B402与OpenHarmony技术大咖近距离互动&#xff0c;分享技术见解&#xff0c;结交志同道合的朋友&#xff01;活动主题聚焦Open…...

C语言——冒泡排序

一、冒泡排序是什么 冒泡排序&#xff1a; 冒泡排序(Bubble Sort)&#xff0c;又被称为气泡排序或泡沫排序。升序时&#xff1a;它会遍历若干次需要排序的数列&#xff0c;每次遍历时&#xff0c;它都会从前往后依次的比较相邻两个数的大小&#xff1b;如果前者比后者大&#x…...

08.智慧商城——购物车布局、全选反选、功能实现

01. 购物车 - 静态布局 基本结构 <template><div class"cart"><van-nav-bar title"购物车" fixed /><!-- 购物车开头 --><div class"cart-title"><span class"all">共<i>4</i>件商品…...

金属压块液压打包机比例阀放大器

液压打包机是机电一体化产品&#xff0c;主要由机械系统、液压控制系统、上料系统与动力系统等组成。整个打包过程由压包、回程、提箱、转箱、出包上行、出包下行、接包等辅助时间组成。市场上液压打包机主要分为卧式与立式两种&#xff0c;立式废纸打包机的体积比较小&#xf…...

python 自动化福音,30行代码手撸ddt模块

用 python 做过自动化的小伙伴&#xff0c;大多数都应该使用过 ddt 这个模块&#xff0c;不可否认 ddt 这个模块确实挺好用&#xff0c;可以自动根据用例数据&#xff0c;来生成测试用例&#xff0c;能够很方便的将测试数据和测试用例执行的逻辑进行分离。 接下来就带大家一起…...

大麦网自动抢票神器:5分钟配置,告别抢票焦虑的终极指南

大麦网自动抢票神器&#xff1a;5分钟配置&#xff0c;告别抢票焦虑的终极指南 【免费下载链接】ticket-purchase 大麦自动抢票&#xff0c;支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 还在为心仪演唱会门票…...

Keil编译器数据类型详解与嵌入式开发实践

1. 变量范围查询指南&#xff1a;Keil编译器数据类型详解 作为一名嵌入式开发老手&#xff0c;我深知在Keil环境下编程时&#xff0c;准确掌握各种数据类型的取值范围是多么重要。今天就来系统梳理C51/C166/C251编译器中的数据类型范围问题&#xff0c;这些经验都是我在实际项目…...

机器学习实战地形图:从问题定义到模型监控的端到端闭环

1. 项目概述&#xff1a;这不是一本“速成手册”&#xff0c;而是一张机器学习领域的实操地形图 “Machine Learning A-Z Briefly Explained”——光看标题&#xff0c;很多人第一反应是“又一本入门书&#xff1f;”、“是不是那种翻两页就堆满公式、第三章就开始推导梯度下降…...

3步搞定老iPhone降级:LeetDown让你的iPhone 5s/6焕发新生

3步搞定老iPhone降级&#xff1a;LeetDown让你的iPhone 5s/6焕发新生 【免费下载链接】LeetDown a macOS app that downgrades A6 and A7 iDevices to OTA signed firmwares 项目地址: https://gitcode.com/gh_mirrors/le/LeetDown 还在为iPhone 5s或iPhone 6升级后卡顿…...

手把手教你用Wireshark抓包分析:一个Easymesh设备到底是怎么‘发现’并‘加入’你家网络的?

用Wireshark解密Easymesh组网&#xff1a;从设备发现到网络接入的全流程解析 当你在客厅新添置了一台支持Easymesh的路由器&#xff0c;通电后它就像有自主意识般自动加入了现有的家庭网络——这种看似"魔法"般的体验背后&#xff0c;其实是一系列精密的协议交互在发…...

Vitis 2021.2自定义IP从Platform到App的完整避坑指南:头文件、宏定义与QEMU报错一网打尽

Vitis 2021.2自定义IP全流程开发实战&#xff1a;从Platform构建到多核调试的深度解析 在FPGA开发领域&#xff0c;Xilinx的Vitis统一软件平台为开发者提供了从硬件设计到软件开发的完整工具链。然而&#xff0c;当涉及到自定义IP集成时&#xff0c;即使是经验丰富的工程师也常…...

Gemini 1.5、Sora与V-JEPA:AI工程水位线的三大坐标轴

1. 这份AI Newsletter到底在讲什么&#xff1f;为什么它值得你花5分钟读完“Towards AI”这个名称&#xff0c;对很多刚接触AI内容生态的朋友来说可能有点陌生——它不是某个大厂的官方号&#xff0c;也不是某位顶流KOL的个人频道&#xff0c;而是一个由一线工程师、研究员和产…...

PyCharm无法引用本地扩展包问题的结解决方法

一、问题&#xff1a;PyCharm无法引用pygame等本地扩展包。二、原因分析PyCharm使用了自带的Python解释器&#xff0c;而扩展包在自己的Python里。三、解决方法&#xff1a;1、换成自己的解释器&#xff0c;也就是把pygame所在的Python解释器引进来。2、具体步骤&#xff1a;汉…...

从LR寄存器到问题函数:一次完整的Cortex-M HardFault调试实录与内存分析心得

从LR寄存器到问题函数&#xff1a;一次完整的Cortex-M HardFault调试实录与内存分析心得 引言&#xff1a;当MCU突然"罢工"时 那是一个周五的深夜&#xff0c;产品量产前的最后一周。测试工程师突然报告设备在特定操作序列下会无规律死机&#xff0c;串口日志最后一行…...

为什么很多企业,做大后反而开始放弃 SaaS?——真正限制企业长期发展的,很多时候不是“功能”,而是“系统控制权”

很多企业第一次做商城系统时。 通常都会特别关注&#xff1a; 上线快不快成本低不低功能全不全能不能快速开展业务 所以&#xff1a; 很多企业前期都会优先选择&#xff1a; SaaS商城系统。 因为&#xff1a; SaaS 最大的优势确实很明显&#xff1a; 快速上线不需要运维…...