【汇编语言】数据处理的两个基本问题(二) —— 解密汇编语言:数据长度与寻址方式的综合应用

在这里插入图片描述

文章目录

  • 前言
  • 1. 指令要处理的数据有多长?
    • 1.1 通过寄存器指明数据的尺寸
      • 1.1.1 字操作
      • 1.1.2 字节操作
    • 1.2 用操作符X ptr指明内存单元的长度
      • 1.2.1 访问字单元
      • 1.2.2 访问字节单元
      • 1.2.3 为什么要用操作符X ptr指明
    • 1.3 其他方法
  • 2. 寻址方式的综合应用
    • 2.1 问题背景(公司基本信息)
    • 2.2 提出问题(公司信息的变化)
    • 2.3 问题的分析与求解
      • 2.3.1 分析要修改的数据
      • 2.3.2 确定修改方法
    • 2.4 程序的实现
    • 2.5 用C语言来描述这个程序
    • 2.6 根据C语言风格修改汇编程序
    • 2.7 总结
  • 结语

前言

📌

汇编语言是很多相关课程(如数据结构、操作系统、微机原理)的重要基础。但仅仅从课程的角度出发就太片面了,其实学习汇编语言可以深入理解计算机底层工作原理,提升代码效率,尤其在嵌入式系统和性能优化方面有重要作用。此外,它在逆向工程和安全领域不可或缺,帮助分析软件运行机制并增强漏洞修复能力。

本专栏的汇编语言学习章节主要是依据王爽老师的《汇编语言》来写的,和书中一样为了使学习的过程容易展开,我们采用以8086CPU为中央处理器的PC机来进行学习。

1. 指令要处理的数据有多长?

8086CPU的指令,可以处理两种尺寸的数据,byte和word。所以在机器指令中要指明,指令进行的是字操作还是字节操作

对于这个问题,汇编语言中用以下方法处理。

1.1 通过寄存器指明数据的尺寸

通过使用8位寄存器还是16位寄存器,来进行字操作还是字节操作。

1.1.1 字操作

下面的指令中,寄存器指明了指令进行的是字操作

mov ax,1
mov bx,ds:[0]
mov ds,ax
mov ds:[0],ax
inc ax
add ax,1000

1.1.2 字节操作

下面的指令中,寄存器指明了指令进行的是字节操作

mov al,1
mov al,bl
mov al,ds:[0]
mov ds:[0],al
inc al
add al,100

1.2 用操作符X ptr指明内存单元的长度

在没有寄存器名存在的情况下,用操作符X ptr指明内存单元的长度,X在汇编指令中可以为word或byte。

1.2.1 访问字单元

下面的指令中,用word ptr指明了指令访问的内存单元是一个字单元

mov word ptr ds:[0],1
inc word ptr [bx]
inc word ptr ds:[0]
add word ptr [bx],2

1.2.2 访问字节单元

下面的指令中,用byte ptr指明了指令访问的内存单元是一个字节单元

mov byte ptr ds:[0],1
inc byte ptr [bx]
inc byte ptr ds:[0]
add byte ptr [bx],2

1.2.3 为什么要用操作符X ptr指明

在没有寄存器参与的内存单元访问指令中,用word ptr或byte ptr显性地指明所要访问的内存单元的长度是很必要的。否则,CPU无法得知所要访问的单元是字单元,还是字节单元。

假设我们用Debug查看内存的结果如下:

2000:1000 FF FF FF FF FF FF……

那么指令:

mov ax,2000H
mov ds,ax  
mov byte ptr [1000H],1

将使内存中的内容变为:2000:1000 01 FF FF FF FF FF……

而指令:

mov ax,2000H 
mov ds,ax 
mov word ptr [1000H],1

将使内存中的内容变为:2000:1000 01 00 FF FF FF FF……

为什么?

应该不用我说了吧~呵呵~不过按照步骤还是说一下,因为我们要兼顾New comer。

这是因为mov byte ptr [1000H],1访问的是地址为 ds:1000H的字节单元,修改的是 ds:1000H单元的内容;

mov word ptr [1000H],1访问的是地址为 ds:1000H 的字单元,修改的是 ds:1000H和ds:1001H两个单元的内容。

1.3 其他方法

有些指令默认了访问的是字单元还是字节单元,比如:push [1000H]就不用指明访问的是字单元还是字节单元,因为push指令只进行字操作

2. 寻址方式的综合应用

2.1 问题背景(公司基本信息)

下面我们通过一个问题来进一步讨论各种寻址方式的作用。

关于DEC公司的一条记录(1982年)如下:

公司名称:DEC

总裁姓名:Ken Olsen

排 名:137

收 入:40(40亿美元)

著名产品:PDP(小型机)

这些数据在内存中以下图所示的方式存放。

在这里插入图片描述

可以看到,这些数据被存放在seg段中从偏移地址60H起始的位置,

从seg:60起始以ASCII字符的形式存储了3个字节的公司名称

从seg:60+3起始以ASCII字符的形式存储了9个字节的总裁姓名

从seg:60+0C起始存放了一个字型数据,总裁在富翁榜上的排名;

从seg:60+0E 起始存放了一个字型数据,公司的收入;

从seg:60+10起始以ASCII字符的形式存储了3个字节的产品名称

2.2 提出问题(公司信息的变化)

以上是该公司1982年的情况,到了1988年DEC公司的信息有了如下变化。

  • (1)Ken Olsen在富翁榜上的排名已升至38位

  • (2)DEC的收入增加了70亿美元

  • (3)该公司的著名产品已变为VAX系列计算机

我们提出的任务是,编程修改内存中的过时数据。

2.3 问题的分析与求解

2.3.1 分析要修改的数据

首先,我们应该分析一下要修改的数据:

  • (1)(DEC公司记录)的(排名字段)

  • (2)(DEC公司记录)的(收入字段)

  • (3)(DEC公司记录)的(产品字段)的(第一个字符)、(第二个字符)、(第三个字符)

2.3.2 确定修改方法

从要修改的内容,我们就可以逐步地确定修改的方法:

  • (1)我们要访问的数据是DEC公司的记录,所以,首先要确定DEC公司记录的位置:R=seg:60

    确定了公司记录的位置后,我们下面就进一步确定要访问的内容在记录中的位置。

  • (2)确定排名字段在记录中的位置:0CH。

    • 修改R+0CH处的数据。
  • (3)确定收入字段在记录中的位置:0EH。

    • 修改R+0EH处的数据。
  • (4)确定产品字段在记录中的位置:10H。

    要修改的产品字段是一个字符串(或一个数组),需要访问字符串中的每一个字符。所以我们要进一步确定每一个字符在字符串中的位置。

    • 确定第一个字符在产品字段中的位置:P=0。
    • 修改R+10H+P处的数据:P=P+1。
    • 修改R+10H+P处的数据:P=P+1。
    • 修改R+10H+P处的数据。

2.4 程序的实现

根据上面的分析,程序如下:

mov ax,seg
mov ds,ax
mov bx,60h                          ;确定记录地址:ds:bxmov word ptr [bx+0ch],38			;排名字段改为38
add word ptr [bx+0eh],70			;收入字段增加70mov si,0							;用si来定位产品字符串中的字符
mov byte ptr [bx+10h+si],’V’
inc si
mov byte ptr [bx+10h+si],’A’
inc si
mov byte ptr [bx+10h+si],’X’

2.5 用C语言来描述这个程序

如果读者熟悉C语言的话,我们可以用C语言来描述这个程序,大致应该是这样的:

struct company{					/*定义一个公司记录的结构体*/char cn[3];					/*公司名称*/char hn[9];					/*总裁姓名*/int pm;					/*排  名*/int sr;						/*收  入*/char cp[3];					/*著名产品*/
struct company dec={"DEC","Ken 0lsen",137,40,"PDP" };/*定义一个公司记录的变量,内存中将存有一条公司的记录*/
int main()
{int i;dec.pm=38;dec.sr=dec.sr+70;i=0;dec.cp[i]='V';i++;dec.cp[i]='A';i++;dec.cp[i]='X';return 0;
}

2.6 根据C语言风格修改汇编程序

我们再按照C语言的风格,用汇编语言写一下这个程序,注意和C语言相关语句的比对:

mov ax seg
mov ds,ax
mov bx,60h							;记录首址送BXmov word ptr [bx].0ch,38			;排名字段改为38;C:dec.pm=38;add word ptr [bx].0eh,70			;收入字段增加 70;C:dec.sr=dec.sr+70;;产品字段改为字符串'VAX'
mov si,0							;C:i=0;
mov byte ptr [bx].10h[si],'V'inc si	;dec.cp[i]='V';
inc si								;i++;
mov byte ptr [bx].10h[si],'A'		;dec.cp[i]='A';
inc si								;i++;		
mov byte ptr [bx].10h[si],'X'		;dec.cp[i]='X'

2.7 总结

我们可以看到,8086CPU提供的如[bx+si+idata]的寻址方式为结构化数据的处理提供了方便。使得我们可以在编程的时候,从结构化的角度去看待所要处理的数据。

从上面我们可以看到,一个结构化的数据包含了多个数据项,而数据项的类型又不相同,有的是字型数据,有的是字节型数据,有的是数组(字符串)。

一般来说,我们可以用[bx+idata+si]的方式来访问结构体中的数据。

用bx定位整个结构体,用idata定位结构体中的某一个数据项,用 si 定位数组项中的每个元素。

为此,汇编语言提供了更为贴切的书写方式。如:[bx].idata[bx].idata[si]

在C语言程序中我们看到,

如:dec.cp[i],dec是一个变量名,指明了结构体变量的地址,cp 是一个名称,指明了数据项cp的地址,而i用来定位cp中的每一个字符。

汇编语言中的做法是:bx.10h[si]对比一下,是不是很相似?

结语

今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下。

也可以点点关注,避免以后找不到我哦!

Crossoads主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是作者前进的动力!

在这里插入图片描述

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

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

相关文章

【算法】【优选算法】前缀和(下)

目录 一、560.和为K的⼦数组1.1 前缀和1.2 暴力枚举 二、974.和可被K整除的⼦数组2.1 前缀和2.2 暴力枚举 三、525.连续数组3.1 前缀和3.2 暴力枚举 四、1314.矩阵区域和4.1 前缀和4.2 暴力枚举 一、560.和为K的⼦数组 题目链接:560.和为K的⼦数组 题目描述&#x…

分布式cap理论学习

【分布式】CAP理论详解 一致性(Consistency) 代表数据在任何时刻,任何分布式节点,看到的都是符合预期的。有点类似于幂等,无论访问哪个节点,得到结果数据一致。 可用性(Availability) 强调的是任意时刻一定能读到数据&#xff…

主机型入侵检测系统(HIDS)——Elkeid在Centos7的保姆级安装部署教程

一、HIDS简介 主机型入侵检测系统(Host-based Intrusion Detection System 简称:HIDS);HIDS作为主机的监视器和分析器,主要是专注于主机系统内部(监视系统全部或部分的动态的行为以及整个系统的状态)。 HIDS使用传统的C/S架构,只需要在监测端安装agent即可,且使用用户…

Python蓝桥杯刷题1

1.确定字符串是否包含唯一字符 题解:调用count函数计算每一个字符出现的次数,如果不等于1就输出no,并且结束循环,如果等于1就一直循环直到计算到最后一个字符,若最后一个字符也满足条件,则输出yes import…

【ARM】MDK在debug模式下的Registers窗口包含哪些内容

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 解决客户对于Debug模式下,对于Registers窗口包含的内容了解。 2、 问题场景 Registers窗口是在进入到debug模式下后,就会出现一个窗口。窗口中包含了很多寄存器信息。但是对于具体内容不了解…

河道无人机雷达测流监测系统由哪几部分组成?

在现代水利管理中,河道无人机雷达监测系统正逐渐成为一种重要的工具,为河道的安全和管理提供了强大的技术支持。那么,这个先进的监测系统究竟由哪几部分组成呢? 河道无人机雷达监测系统工作原理 雷达传感器通过发射电磁波或激光束…

浅谈数据仓库的架构及其演变

一、数据仓库分层架构 数据仓库分层一般分为三层,分别为数据仓库ODS层(数据进出口贴源层)、CDM层(数据公共层)和ADS层(数据应用层)。 1. ODS层:这是数据仓库的最底层,直接…

event_base

build default event_base event_base_new()函数分配并且返回一个新的具有默认设置的event_base。函数会检测环境变量,返回一个到event_base的指针。如果发生错误,则返回NULL。选择各种方法时,函数会选择OS支持的最快方法。 event_base_new…

PyTorch使用教程-深度学习框架

PyTorch使用教程-深度学习框架 1. PyTorch简介 1.1-什么是PyTorch ​ PyTorch是一个广泛使用的开源机器学习框架,特别适合深度学习的应用。它以其动态计算图而闻名,允许在运行时修改模型,使得实验和调试更加灵活。PyTorch提供了强大的GPU加…

数据科学与SQL:如何计算排列熵?| 基于SQL实现

目录 0 引言 1 排列熵的计算原理 2 数据准备 3 问题分析 4 小结 0 引言 把“熵”应用在系统论中的信息管理方法称为熵方法。熵越大,说明系统越混乱,携带的信息越少;熵越小,说明系统越有序,携带的信息越多。在传感…

28.<Spring博客系统⑤(部署的整个过程(CentOS))>

引入依赖 Spring-boot-maven-plugin 用maven进行打包的时候必须用到这个插件。看看自己pom.xml中有没有这个插件 并且看看配置正确不正常。 注&#xff1a;我们这个项目打的jar包在30MB左右。 <plugin><groupId>org.springframework.boot</groupId><artif…

无人机在森林中的应用!

一、森林资源调查 无人机可以利用遥感技术快速获取所需区域高精度的空间遥感信息&#xff0c;对森林图斑进行精确区划。相较于传统手段&#xff0c;无人机调查具有低成本、高效率、高时效的特点&#xff0c;尤其在地理环境条件不好的区域&#xff0c;调查人员无法或难以到达的…

esp32c3开发板通过micropython的mqtt库连MQTT物联网消息服务器

MQTT介绍 MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级的消息协议&#xff0c;旨在设备之间进行通信&#xff0c;尤其是在网络条件较差的情况下。MQTT v3.1.1 和 MQTT v5 是该协议的两个主要版本。 MQTT v3.1.1&#xff1a; 优点&#xff…

什么是SMARC?模块电脑(核心板)规范标准简介三

1. 概念 SMARC&#xff08;Smart Mobility ARChitecture&#xff0c;智能移动架构&#xff09;是一种通用的小型计算机模块定义&#xff0c;基于ARM和X86技术的模块化计算机低功耗嵌入式架构平台&#xff0c;旨在满足低功耗、低成本和高性能的应用需求。这些模块通常使用与平板…

resnet50,clip,Faiss+Flask简易图文搜索服务

一、实现 文件夹目录结构&#xff1a; templates -----upload.html faiss_app.py 前端代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widt…

JavaWeb——JS、Vue

目录 1.JavaScript a.概述 b.引入方式 c.JS的基础语法 d.JS函数 e.JS对象 f.JS事件监听 2.Vue a.概述 b.Vue常用指令 d.生命周期 1.JavaScript a.概述 JavaScript是一门跨平台、面向对象的脚本语言。是用来控制网页行为的&#xff0c;它能使网页可交互。JavaScript和…

MySQL的编程语言

一、MySQL基础 使用系统的全局变量@@VERSION查看当前使用的MySQL的版本信息,SQL语句如下: select @@version; 将局部变量varl声明为char的类型,长度值为10,并为其赋值为“程菲” begin declare var1 char(10); set @var1="程菲"; end 通过局部变量查看d_eams数…

小程序-基于java+SpringBoot+Vue的驾校预约平台设计与实现

项目运行 1.运行环境&#xff1a;最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境&#xff1a;IDEA&#xff0c;Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境&#xff1a;Tomcat 7.x,8.x,9.x版本均可 4.硬件环境&#xff1a…

阿里云引领智算集群网络架构的新一轮变革

阿里云引领智算集群网络架构的新一轮变革 云布道师 11 月 8 日~ 10 日在江苏张家港召开的 CCF ChinaNet&#xff08;即中国网络大会&#xff09;上&#xff0c;众多院士、教授和业界技术领袖齐聚一堂&#xff0c;畅谈网络未来的发展方向&#xff0c;聚焦智算集群网络的创新变…

【ASR技术】WhisperX安装使用

介绍 WhisperX 是一个开源的自动语音识别&#xff08;ASR&#xff09;项目&#xff0c;由 m-bain 开发。该项目基于 OpenAI 的 Whisper 模型&#xff0c;通过引入批量推理、强制音素对齐和语音活动检测等技术。提供快速自动语音识别&#xff08;large-v2 为 70 倍实时&#xf…