当前位置: 首页 > 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;能够很方便的将测试数据和测试用例执行的逻辑进行分离。 接下来就带大家一起…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

libfmt: 现代C++的格式化工具库介绍与酷炫功能

libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库&#xff0c;提供了高效、安全的文本格式化功能&#xff0c;是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全&#xff1a…...

基于鸿蒙(HarmonyOS5)的打车小程序

1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...