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

在这里插入图片描述

文章目录

  • 前言
  • 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:bx

mov word ptr [bx+0ch],38			;排名字段改为38
add word ptr [bx+0eh],70			;收入字段增加70

mov 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							;记录首址送BX

mov 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主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是作者前进的动力!

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【ArcGIS微课1000例】0130:图层组详解与使用

文章目录 一、图层组概述二、创建图层组三、在图层组中管理图层四、对话框中图层组的列表一、图层组概述 图层组包含其他图层。图层组有助于对地图中相关类型的图层进行组织,并且可用于定义高级绘制选项。例如,假设在地图上有两个图层分别用于表示铁路和高速公路。您可将这些…

Cyberchef配合Wireshark提取并解析TCP/FTP流量数据包中的文件

前一篇文章中讲述了如何使用cyberchef提取HTTP/TLS数据包中的文件,详见《Cyberchef配合Wireshark提取并解析HTTP/TLS流量数据包中的文件》,链接这里,本文讲述下如何使用cyberchef提取FTP/TCP数据包中的文件。 FTP 是最为常见的文件传输协议,和HTTP协议不同的是FTP协议传输…

SpringBoot多环境配置的实现

前言 开发过程中必然使用到的多环境案例,通过简单的案例分析多环境配置的实现过程。 一、案例 1.1主配置文件 spring:profiles:active: prod server:port: 80801.2多环境配置文件 开发环境 blog:domain: http://localhost:8080测试环境 blog:domain: https:/…

本草纲目数字化:Spring Boot在中药实验管理中的应用

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理中药实验管理系统的相关信息成为必然。开发…

linux文件与重定向

目录 一、共识原理 二、回顾C语言文件函数 1.fopen 2.fwrite 3.fclose 三、文件系统调用 1.open 2.write 3.访问文件的本质 4.stdin&&stdout&&stderror 5.文件的引用计数 四、重定向 1.文件描述符的分配规则 2. 输出重定向 3.重定向系统调用 4.…

【微服务】SpringBoot 整合ELK使用详解

目录 一、前言 二、为什么需要ELK 三、ELK介绍 3.1 什么是elk 3.2 elk工作原理 四、ELK搭建 4.1 搭建es环境 4.1.1 获取es镜像 4.1.2 启动es容器 4.1.3 配置es参数 4.1.4 重启es容器并访问 4.2 搭建kibana 4.2.1 拉取kibana镜像 4.2.2 启动kibana容器 4.2.3 修改…

基于YOLOv8深度学习的汽车车身车损检测系统研究与实现(PyQt5界面+数据集+训练代码)

本文研究并实现了一种基于YOLOV8深度学习模型的汽车车身车损检测系统,旨在解决传统车损检测中效率低、精度不高的问题。该系统利用YOLOV8的目标检测能力,在单张图像上实现了车身损坏区域的精确识别和分类,尤其是在车身凹痕、车身裂纹和车身划…

ui->tableView升序

亮点 //设置可排序ui->tableView->setSortingEnabled(true);ui->tableView->sortByColumn(0,Qt::AscendingOrder); //排序void Widget::initTable() {//设置焦点策略:ui->tableView->setFocusPolicy(Qt::NoFocus);//显示网格线:ui->tableView->se…

Android Framework AMS(16)进程管理

该系列文章总纲链接:专题总纲目录 Android Framework 总纲 本章关键点总结 & 说明: 说明:本章节主要解读AMS 进程方面的知识。关注思维导图中左上侧部分即可。 我们本章节主要是对Android进程管理相关知识有一个基本的了解。先来了解下L…

QT_CONFIG宏使用

时常在Qt代码中看到QT_CONFIG宏,之前以为和#define、DEFINES 差不多,看了定义才发现不是那么回事,定义如下: 看注释就知道了QT_CONFIG宏,其实是:实现了一个在编译时期安全检查,检查指定的Qt特性…

Spring Boot教程之Spring Boot简介

Spring Boot 简介 接下来一段时间,我会持续发布并完成Spring Boot教程 Spring 被广泛用于创建可扩展的应用程序。对于 Web 应用程序,Spring 提供了 Spring MVC,它是 Spring 的一个广泛使用的模块,用于创建可扩展的 Web 应用程序。…

Vue2教程001:初识Vue

文章目录 1、初识Vue1.1、Vue2前言1.2、创建Vue实例1.3、插值表达式1.4 Vue响应式特性 1、初识Vue 1.1、Vue2前言 Vue是什么? 概念:Vue是一个用于构建用户界面的渐进式框架。 Vue的两种使用方式: Vue核心包开发 场景:局部模块…

Linux手动安装nginx

本次以安装nginx-1.12.2为例 1、首先说明一下,安装nginx之前需要安装如下素材: 2、开始安装 第一步,安装依赖 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel第二步,下载并安装nginx安装包(n…

Element-ui Select选择器自定义搜索方法

效果图 具体实现 <template><div class"home"><el-selectref"currencySelect"v-model"currency"filterable:spellcheck"false"placeholder"请选择":filter-method"handleCurrencyFilter"change&q…

leetcode-44-通配符匹配

题解&#xff1a; 代码&#xff1a; 参考&#xff1a; (1)牛客华为机试HJ71字符串通配符 (2)leetcode-10-正则表达式匹配

C/C++中使用MYSQL

首先要保证下载好mysql的库和头文件&#xff0c;头文件在/usr/include/mysql/目录下&#xff0c;库在/usr/lib64/mysql/目录下&#xff1a; 一般情况下&#xff0c;在我们安装mysql的时候&#xff0c;这些都提前配置好了&#xff0c;如果没有就重装一下mysql。如果重装mysql还是…

Tryhackme练习-Wonderland

基本信息 由于tryhackme是在线靶场&#xff0c;所以这里的IP均为对方的内网IP 攻击机器&#xff1a;10.10.242.186 靶机&#xff1a;10.10.173.3 目标&#xff1a;获取2个flagroot权限 具体流程 信息收集 首先我们使用fscan进行端口扫描&#xff0c;fscan -h 10.10.173.…

SQL笔试题笔记(1)

下列选项中关于数据库事务的特性描述正确的是&#xff08;&#xff09; A.事务允许继续分割B.多个事务在执行事务前后对同一个数据读取的结果是不同的C.一个事务对数据库中数据的改变是暂时的D.并发访问数据库时&#xff0c;各并发事务之间数据库是独立的 答案解析&#xff1a…

vue3 如何调用第三方npm包内部的 pinia 状态管理库方法

抛砖引玉: 如果在开发vue3项目是, 引用了npm第三方包 ,而且这个包内使用了Pinia 状态管理库,那我们如何去调用 npm内部的 Pinia 状态管理库呢? 实际遇到的问题: 今天在制作npm包时遇到的问题,之前Vue2版本的时候状态管理库用的Vuex ,当时调用npm包内的状态管理库很简单,直接引…

麒麟KylinServer的网站,并部署一套主从DNS服务器提供域名解析服务

一、KylinServer网站搭建 ifconfig Copy 注意:根据实际网卡设备名称情况调整代码!不同环境下网卡名称略有不同! 获取本机IP地址,记住IP地址用于之后的配置填写。 ifconfig enp0s2 Copy 下载nginx源码包,并解压缩 wget http://10.44.16.102:60000/allfiles/Kylin/ng…