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

news2024/11/19 6:07:33

在这里插入图片描述

文章目录

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

在这里插入图片描述

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

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

相关文章

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

目录 一、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…

【进阶系列】正则表达式 #匹配

正则表达式 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。re模块使 Python 语言拥有全部的正则表达式功能。 一个正则表达式的匹配工具:regex101: build, test, and debug regex s "C:\\a\\b\\c" pri…

【技术解析】Dolphinscheduler实现MapReduce任务的高效管理

MapReduce是一种编程模型,用于处理和生成大数据集,主要用于大规模数据集(TB级数据规模)的并行运算。本文详细介绍了Dolphinscheduler在MapReduce任务中的应用,包括GenericOptionsParser与args的区别、hadoop jar命令参…

Debezium-MySqlConnectorTask

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 MySqlConnectorTask,用于读取MySQL的二进制日志并生成对应的数据变更事件 整体架构流程 技术名词解释 数据库模式(Database Schema) 数据库模式是指数据库中数据的组织结构和定义&…

剧本杀门店预约小程序,解锁沉浸式推理体验

一、开发背景 剧本杀作为一种热门娱乐游戏,深受大众的欢迎,但随着市场的快速发展,竞争也在不断加大,对于剧本杀线下商家来说面临着发展创新。 剧本杀线下门店数量目前正在逐渐增加,竞争激烈,而门店的获客…

今天你学C++了吗——C++启航之入门知识

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…

【element-tiptap】Tiptap编辑器核心概念----结构篇

core-concepts 前言:这篇文章来介绍一下 Tiptap 编辑器的一些核心概念 (一)结构 1、 Schemas 定义文档组成方式。一个文档就是标题、段落以及其他的节点组成的一棵树。 每一个 ProseMirror 的文档都有一个与之相关联的 schema,…

LC69---219存在重复元素(滑动窗口)---Java版

1.题目描述 2.思路 3.代码实现 public class Solution { public boolean containsNearbyDuplicate(int[] nums, int k) {Map<Integer,Integer> m1new HashMap<>();// 1:0, 2:1,3:2,1:3 key存数组的值&#xff0c;value存索引&#xff0c;为getnum[i]做准备&am…

【C++】了解map和set及平衡二叉树和红黑树的原理

目录 ​编辑 一、关联式容器 二、 键值对 三、pair介绍 四、树形结构的关联式容器 4.1 set 4.2 map 4.3 multiset 4.4 multimaps 五、底层结构&#xff08;重点&#xff09; 5.1 AVL 树 5.1.1 AVL树的概念 5.1.2 AVL树节点的定义 5.1.3 AVL树的旋转 5.1.4 AVL树的…

LeetCode 力扣 热题 100道(五)最长回文子串(C++)

最长回文子串 给你一个字符串 s&#xff0c;找到 s 中最长的 回文子串。 回文性 如果字符串向前和向后读都相同&#xff0c;则它满足 回文性 子字符串子字符串 是字符串中连续的 非空 字符序列。 动态规划法 class Solution { public:string longestPalindrome(string s) {i…

Spring Boot汽车资讯:科技与汽车的新融合

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了汽车资讯网站的开发全过程。通过分析汽车资讯网站管理的不足&#xff0c;创建了一个计算机管理汽车资讯网站的方案。文章介绍了汽车资讯网站的系统分析部分&…

逆向攻防世界CTF系列41-EASYHOOK

逆向攻防世界CTF系列41-EASYHOOK 看题目是一个Hook类型的&#xff0c;第一次接触&#xff0c;虽然学过相关理论&#xff0c;可以看我的文章 Hook入门(逆向)-CSDN博客 题解参考&#xff1a;https://www.cnblogs.com/c10udlnk/p/14214057.html和攻防世界逆向高手题之EASYHOOK-…

【网络】HTTP 协议

目录 基本概念基于 HTTP 的系统组成HTTP 的基本性质 HTTP 请求头 & 响应头HTTP 的请求方法HTTP 的返回码HTTP 的 CookieHTTP 缓存 Cache-Control会话HTTP/1.x 的连接管理 基本概念 HTTP&#xff08;Hypertext Transfer Protocol&#xff0c;超文本传输协议&#xff09;是一…

执行flink sql连接clickhouse库

手把手教学&#xff0c;flink connector打通clickhouse大数据库&#xff0c;通过下发flink sql&#xff0c;来使用ck。 组件版本jdk1.8flink1.17.2clickhouse23.12.2.59 1.背景 flink官方不支持clickhouse连接器&#xff0c;工作中难免会用到。 2.方案 利用GitHub大佬提供…

笔记|M芯片MAC (arm64) docker上使用 export / import / commit 构建amd64镜像

很简单的起因&#xff0c;我的东西最终需要跑在amd64上&#xff0c;但是因为mac的架构师arm64&#xff0c;所以直接构建好的代码是没办法跨平台运行的。直接在arm64上pull下来的docker镜像也都是arm64架构。 检查镜像架构&#xff1a; docker inspect 8135f475e221 | grep Arc…

免费送源码:Java+Springboot+MySQL Springboot多租户博客网站的设计 计算机毕业设计原创定制

Springboot多租户博客网站的设计 摘 要 博客网站是当今网络的热点&#xff0c;博客技术的出现使得每个人可以零成本、零维护地创建自己的网络媒体&#xff0c;Blog站点所形成的网状结构促成了不同于以往社区的Blog文化&#xff0c;Blog技术缔造了“博客”文化。本文课题研究的“…

代码随想录第46期 单调栈

这道题主要是单调栈的简单应用 class Solution { public:vector<int> dailyTemperatures(vector<int>& T) {vector<int> result(T.size(),0);stack<int> st;st.push(0);for(int i1;i<T.size();i){if(T[i]<T[st.top()]){st.push(i);}else{wh…

【Three.js基础学习】24. shader patterns

前言 课程回顾: ShaderMaterial 这里用的是着色器材质 所以顶点和片段着色器就不需要像原始着色器那样添加需要的属性 然后写 片段着色器需要属性 &#xff1a; 顶点 属性 -》变化 -》 片段中 顶点中的属性不需要声明 只需要声明传送的变量 例如 varying vec vUv; vUv uv; 补充…

力扣整理版七:二叉树(待更新)

满二叉树&#xff1a;如果一棵二叉树只有度为0的结点和度为2的结点&#xff0c;并且度为0的结点在同一层上&#xff0c;则这棵二叉树为满二叉树。深度为k&#xff0c;有2^k-1个节点的二叉树。 完全二叉树&#xff1a;在完全二叉树中&#xff0c;除了最底层节点可能没填满外&am…

173. 二叉搜索树迭代器【 力扣(LeetCode) 】

文章目录 零、原题链接一、题目描述二、测试用例三、解题思路四、参考代码 零、原题链接 173. 二叉搜索树迭代器 一、题目描述 实现一个二叉搜索树迭代器类BSTIterator &#xff0c;表示一个按中序遍历二叉搜索树&#xff08;BST&#xff09;的迭代器&#xff1a; BSTIterato…