汇编:数组-寻址取数据

比例因子寻址

比例因子寻址(也称为比例缩放索引寻址或基址加变址加比例因子寻址)是一种复杂的内存寻址方式,常用于数组和指针操作。它允许通过一个基址寄存器、一个变址寄存器和一个比例因子来计算内存地址。

语法

比例因子寻址的通用格式为:

[base + index * scale + displacement]
  • base:基址。

  • index:变址寄存器(如 ESIEDI 等)。

  • scale:比例因子,可以是 1、2、4、8(根据数组元素数据类型决定)。

  • displacement:位移量,可以是一个立即数(常数)。

示例:使用循环来操作一个字节数组
.586
.model flat,stdcall
option casemap:none
​
.data
byte_arr db 13,23,14,25 ;定义数组
​
.code
main procxor ebx,ebx   ;xor异或指令;将 EBX 寄存器清零。mov eax,offset byte_arr  
loop_a:mov [eax + ebx * 1],bl  ;[eax + ebx * 1] 可以获取到字节数组每个元素的地址(ebx可以自加);若是字数组:[eax + ebx * 2],双字数组:[eax + ebx * 4]..根据数组元素类型选择数字(字节)inc blcmp ebx,4jl loop_a
main endp
end
代码执行过程
  1. 初始化 EBX 为 0 和 EAXbyte_arr 的地址。

  2. 进入循环,[eax + ebx * 1] 依次访问 byte_arr 的每个字节,将 BL 寄存器的值(从 0 开始递增)存储到数组的每个元素中。

  3. 循环结束后,byte_arr 的所有元素将被替换为 [0, 1, 2, 3]

代码段解释:
  • xor ebx,ebxEBX 寄存器清零,即 EBX = 0

  • mov eax,offset byte_arrbyte_arr 的地址加载到 EAX 寄存器。

  • loop_a: 是标签,表示循环的起始位置。

  • mov [eax + ebx * 1],blBL 寄存器的值存储到 byte_arr 数组中的相应位置。具体来说,[eax + ebx * 1] 计算数组 byte_arr 中的当前元素地址,并将 BL 的值存储到该位置。因为 EBX 从 0 开始,因此这将依次操作 byte_arr 的每个字节。(EBX32位寄存器,但是由于此时数组元素为1字节,8位数据;所以次数若是将ebx中的数据mov至数组元素中会造成数据溢出,所以只能movBL

  • inc blBL 寄存器的值加 1。

  • cmp ebx,4EBX 寄存器的值与 4 进行比较。

  • jl loop_a 如果 EBX 的值小于 4,则跳转到 loop_a,继续循环。

代码执行效果

byte_arr 将从原来的 [13, 23, 14, 25] 被修改为 [0, 1, 2, 3]

执行前数组内的数据:

执行后数组内的数据:

取数据

通过比例因子寻址取到地址后就可以使用LODS系列指令取数据。

LODS(Load String)指令是一条字符串操作指令,用于从数据段加载一个字节、一个字(16位),或者一个双字(32位)到累加器寄存器(AL, AX, EAX)。它使用源索引寄存器 ESI 来指示要加载的数据的地址,并根据方向标志位(DF)来决定 ESI 的增减。

语法
  • LODSB:从 [ESI] 加载一个字节到 AL,并根据 DF 更新 ESI

  • LODSW:从 [ESI] 加载一个字到 AX,并根据 DF 更新 ESI

  • LODSD:从 [ESI] 加载一个双字到 EAX,并根据 DF 更新 ESI

方向标志位(DF)
  • 如果 DF 为 0(使用 CLD 清除),ESI 递增。

  • 如果 DF 为 1(使用 STD 设置),ESI 递减。

示例:

使用 LODSB 指令从数组中逐字节加载数据。

.586
.model flat,stdcall
option casemap:none
​
.data
byte_arr db 13,23,14,25
​
.code
main proc
;取数据代码xor eax,eax     ;将 EAX 寄存器清零。mov esi,offset byte_arrmov ecx,4
lods_a:lodsb   ;根据ESI中的数组基地址,将数据加载至AL寄存器中loop lods_a
​
main endp
end 

xor eax,eax:将 EAX 寄存器清零。

mov esi,offset byte_arr:将数组 byte_arr 的地址加载到 ESI 寄存器。

mov ecx,4:将 ECX 寄存器设置为 4,表示要处理的字节数。

lods_a::标签,表示循环的起始位置。

lodsb:从 ESI 指向的地址加载一个字节到 AL 寄存器,并根据方向标志(DF)更新 ESI。默认情况下,ESI 会递增。

loop lods_a:将 ECX 寄存器的值减 1;如果 ECX 的值不为 0,则跳转到 lods_a,继续循环。

内存中的数组:

取出数据:

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

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

相关文章

LeetCode //C - 168. Excel Sheet Column Title

168. Excel Sheet Column Title Given an integer columnNumber, return its corresponding column title as it appears in an Excel sheet. For example: A -> 1 B -> 2 C -> 3 … Z -> 26 AA -> 27 AB -> 28 … Example 1: Input: columnNumber 1 Outp…

经典文献阅读之--Online Monocular Lane Mapping(使用Catmull-Rom样条曲线完成在线单目车道建图)

0. 简介 对于单目摄像头完成SLAM建图这类操作,对于自动驾驶行业非常重要,《Online Monocular Lane Mapping Using Catmull-Rom Spline》介绍了一种仅依靠单个摄像头和里程计生成基于样条的在线单目车道建图方法。我们提出的技术将车道关联过程建模为一个…

Java 习题集

💖 单选题 💖 填空题 💖 判断题 💖 程序阅读题 1. 读代码写结果 class A {int m 5;void zengA(int x){m m x;}int jianA(int y){return m - y;} }class B extends A {int m 3;int jianA(int z){return super.jianA(z) m;} …

Java Web学习笔记20——Ajax-Axios

Axios: 介绍:Axios对原生的Ajax进行封装,简化书写,快速开发。 官网:https://www.axios-http.cn Axios 入门: {}是Js的对象。 get的请求参数是在URL后面?和相关参数值。 post的请求参数是在请…

优化Elasticsearch搜索性能:查询调优与索引设计

在构建一个基于Elasticsearch的搜索解决方案时,性能优化是一个至关重要的环节。无论是处理海量数据,还是满足快速响应的搜索需求,优化Elasticsearch的性能都能显著提高用户体验和系统效率。本文将重点介绍如何通过查询调优和索引设计来优化El…

Soildworks学习笔记(二)

放样凸台基体: 自动生成连接两个物体两个面的基体: 2.旋转切除: 3.剪切实体: 4.转换实体引用: 将实体的轮廓线转换至当前草图使其成为当前草图的图元,主要用于在同一平面或另一个坐标中制作草图实体或其尺寸的副本。 …

【深度学习】Transformer分类器,CICIDS2017,入侵检测

文章目录 1 前言2 什么是入侵检测系统?3 为什么选择Transformer?4 数据预处理5 模型架构5.1. 输入嵌入层(Input Embedding Layer)5.2. 位置编码层(Positional Encoding Layer)5.3. Transformer编码器层&…

通过SSH远程登录华为设备

01 进入系统编辑视图 system-view Enter system view, return user view with return command. 02 创建本地RSA密钥对 [HUAWEI]rsa local-key-pair creat The key name will be:HUAWEI_Host The range of public key size is (2048 ~ 2048). NOTE: Key pair generation will ta…

17、关于加强数据资产管理的指导意见

数据资产,作为经济社会数字化转型进程中的新兴资产类型,正日益成为推动数字中国建设和加快数字经济发展的重要战略资源。为深入贯彻落实党中央决策部署,现就加强数据资产管理提出如下意见。 一、总体要求 (一)指导思想。 以新时代中国特色社会主义思想为指导,全面深入…

CF817F MEX Queries 题解

题目描述 解题思路 考虑分块。发现 l l l 和 r r r 的范围都很大,但是我们只需要知道第一个没有出现的正整数是在哪个位置,然后就能得到答案,所以我们把 l l l、 r r r、 r + 1 r+1 r+1 离散化,然后用一个数组映射回去,我们求得位置后就可以通过这个映射数组求出具体…

设计模式 —— 装饰器模式

设计模式 —— 装饰器模式 什么是装饰器模式通俗解释 Component(组件接口)ConcreteComponent(具体组件)Decorator(装饰器接口)ConcreteDecorator(具体装饰器)装饰器模式优缺点优点缺…

MySQL—多表查询—子查询(介绍)

一、引言 上一篇博客学习完联合查询。 这篇开始,就来到多表查询的最后一种形式语法块——子查询。 (1)概念 SQL 语句中嵌套 SELECT 语句,那么内部的 select 称为嵌套查询,又称子查询。 表现形式 注意: …

复数的概念

1. 虚数单位:i 引入一个新数 ‘i’,i又叫做虚数单位,并规定: 它的平方等于 -1,即 i -1。实数可以与它进行四则运算,并且原有的加,乘运算律依然成立。 2.定义 复数的定义:形如 a…

Github 2024-06-09 php开源项目日报Top10

根据Github Trendings的统计,今日(2024-06-09统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目10Blade项目1Livewire: Laravel中构建动态UI组件的全栈框架 创建周期:1818 天开发语言:PHP协议类型:MIT LicenseStar数量:21388 个F…

CTFHUB-SQL注入-字符型注入

目录 查询数据库名 查询数据库中的表名 查询表中数据 总结 此题目和上一题相似,一个是整数型注入,一个是字符型注入。字符型注入就是注入字符串参数,判断回显是否存在注入漏洞。因为上一题使用手工注入查看题目 flag ,这里就不…

LeetCode题练习与总结:买卖股票的最佳时机--121

一、题目描述 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获…

GIS数据快捷共享发布工具及操作视频

有网友反映还是不会操作GIS数据快捷共享发布工具(建立自己的地图网站),要我录个视频。 好,那就录一个: GIS数据快捷共享发布工具及操作视频 虽然默认例子是二维的,但这个服务器可以为二维、三维系统发布时间服务。都是…

NASA数据集——SARAL 近实时增值业务地球物理数据记录海面高度异常

SARAL Near-Real-Time Value-added Operational Geophysical Data Record Sea Surface Height Anomaly SARAL 近实时增值业务地球物理数据记录海面高度异常 简介 2020 年 3 月 18 日至今 ALTIKA_SARAL_L2_OST_XOGDR 这些数据是近实时(NRT)&#xff…

SpringCloudAlibaba基础二 Nacos注册中心

一 什么是 Nacos 官方:一个更易于构建云原生应用的动态服务发现(Nacos Discovery )、服务配置(Nacos Config)和服务管理平台。 集 注册中心配置中心服务管理 平台。 Nacos 的关键特性包括: 服务发现和服务健康监测动态配置服务动态 DNS 服务服务及其元数据管理 …

达梦8 探寻达梦排序原理:新排序机制(SORT_FLAG=1)

测试版本:--03134283938-20221019-172201-20018 达梦的排序机制由四个dm.ini参数控制: #maximum sort buffer size in Megabytes ,有效值范围(1~2048) SORT_BUF_SIZE 100 #ma…