速通汇编(五)认识段地址与偏移地址,CS、IP寄存器和jmp指令,DS寄存器

news2024/9/20 14:50:12

一,地址的概念

通常所说的地址指的是某内存单元在整个机器内存中的物理地址,把整个机器内存比作一个酒店,内存单元就是这个酒店的各个房间,给这些房间编的门牌号,类比回来就是内存单元的物理地址

在第一篇介绍debug的命令时使用过很多命令,不知你还记得与否,可点击快速复习->速通汇编(一)汇编环境配置(附资源),debug六种命令使用,四个通用寄存器_d指令怎么看寄存器中内容-CSDN博客

接下来我用e命令和d命令进行两步操作:在[0000:0000]地址处写入一串数据"123456789abc",然后再用d命令读取以验证是否成功写入

可以看到确实成功写入

0e1bedaf499144959227c06dac186f58.png

(一)物理地址的表示方式

(1)段地址:偏移地址

看上图,我刚刚在[0000:0000]地址处写入了一串数据,这个[0000:0000]就是一个确切的物理地址,它由两部分组成,冒号左边是段地址,右边是偏移地址

需要提前说明,地址一定是用16进制数来表示的!

形象来说,酒店分5层,那么其中有几个房间的门牌号是207、310、404等等,我们正常的认知都知道这里的2、3、4是根据楼层来编的,后面的07、10、04则是基于它们各自的楼层的额外编号,所以段地址和偏移地址就是一个这样类似的概念,段地址相当于楼层号,再拼上一个偏移地址就能具体到一个房间门牌号(确定了内存单元的物理地址)

(2)单个十六进制数表示地址

物理地址 = 段地址*16+偏移地址

使用这个公式,可以将一个地址确切地表示成一个数而不是用段地址:偏移地址的形式来表示(这样才方便使用地址)

举几个例子(地址是十六进制数,乘16相当于整体左移一位,再加上偏移地址即是物理地址):

①0000:0000 == 0000*16+0000 == 00000

②1100:00bc == 1100*16+00bc == 110bc

③2000:1F60 == 2000*16+1F60 == 21F60

④2100:0F60 == 2100*16+0F60 == 21F60

⑤21F6:0000 == 21F6*16+0000 == 21F60

通过上述例子,相信你很清楚了如何表示地址,并且通过后3个例子,不难领悟到,同一个物理地址,可以用多个段地址:偏移地址的形式来表示

可以用下面这个例子来证明这点,可以发现,查看[2000:1F60]处的数据和[21F6:0000]处的数据是一模一样的,它们表示的确实是同一块内存的物理地址

458f90a3272140379621b71bf339bb27.png


二 ,CS、IP寄存器和jmp指令的作用

在第一篇时我们粗略介绍过所有寄存器,现在领略了地址的概念,再趁势学习一下CS和IP寄存器的具体作用

在debug模式下,使用a命令可以在[CS:IP]地址下写入汇编指令,任意时刻,CPU都将[CS:IP]指向的内容(“指向”就是地址的形象说法)当作指令执行(当然不是说你写进去就直接执行了,你需要用命令去让它执行,比如t命令)

因此,我们可以合理规划一台机器的内存,将需要的汇编代码写在内存的某些位置,然后通过改变[CS:IP]的内容,达到运行代码的目的

那要如何修改CS和IP的内容呢?mov cs,xxxx这样吗?不可以这样,CS和IP这两个寄存器的值不能用mov指令来改变,而要用jmp指令来赋值

使用形如【jmp 段地址:偏移地址】的指令,才可以修改[CS:IP]的内容

(补充:还可以使用形如【jmp 偏移地址】的指令,这样的指令被执行之后将只改变IP寄存器的值,CS寄存器的值不变,即只改偏移地址不改变段地址)

实例:

b106e1877b7b4bb48e00126e14cd2135.png

然后在[CS:IP]正指向的地址处写下这条jmp指令,让CS和IP能够跳转到刚刚写好3条汇编的地址处

c71f7b08fe0d4c26bdc5d9536de06d4c.png

t执行[CS:IP]处的汇编【jmp 2000:1F60】,观察到CS和IP的内容确实变成了[2000:1F60]

95041c94464b4f598d747399d0edb21a.png

继续使用t命令,因为此时[CS:IP]已经指向[2000:1F60]了,那么刚刚提前写好的3条汇编理所应当地被正确执行

6eae9f023b3049d4b55dde80653b448e.png


三,DS寄存器的作用

回到开头,我们在[0000:0000]地址处写下了"123456789abc"这串数据

0e1bedaf499144959227c06dac186f58.png

现在的问题是,就好比你学习高级编程语言时,定义变量并赋值存好数据之后,要如何去使用它呢? 

使用[偏移地址]的形式,就可以取用了

这时你应该心生疑问,前面不是说要段地址:偏移地址的形式才能确定一块物理地址吗,怎么这里中括号里面只用写偏移地址了呢?这时你看这块的小标题,应该恍然大悟了吧——是的,此时段地址就由DS来决定

可以如此说:汇编中出现的形如[偏移地址]形式的地址,指的都是[DS:偏移地址],即DS*16+偏移地址处的内存

那要如何修改DS的值呢?

不能直接【mov ds,段地址】,你可以先把段地址存入ax/bx/cx/dx这四个寄存器,然后再【mov ds,寄存器

或者更加省事一点的方法,用r命令直接修改ds的值(当然在实际编程中没办法用r命令,只有debug模式下可以)

也就是说,如果我想要读取[0000:0000]处的数据,那么就先让DS寄存器来存放这里的段地址0000,然后直接写汇编【mov ax,[0]】,cpu就知道你要做的事情是将[0000:0000]处的内容赋值给ax,下面进行实例验证

①先在[cs:ip]处写好3条简单的mov指令汇编

② 修改ds寄存器的值为0000,待会段地址就是0000了

f040709ce499403e89afc049f69f7712.png

③t命令执行完提前写好的3条mov汇编,观察到ax、bx、cx寄存器的值被分别赋值成3412、5634、7856

4aafec44f46b4c6785a2e616f4f4f00c.png

我们来分析一下原因:

首先ds寄存器的值被提前修改成了0000,意味着段地址全程是0000,下图是提前在[0000:0000]处写好的数据"123456789abc"

1723f8cc2b644751bc9a637d629908cd.png

①第一条汇编是【mov ax,[0]】 ,将[0000:0000]处的内容赋值给ax,因为ax是十六位寄存器,因此它会从[0000:0000]处取4位十六进制数,12显然是不够的(才两位),因此再取后两位34凑成3412赋值给ax。

为什么是3412而不是1234呢?因为12是低地址处(偏左边)的数据,应该放在ax寄存器的低位al处;34是高地址处(偏右边)的数据,应该放在ax寄存器的高位ah处,而ax是ah+al,ah在前,也就成了3412这样看起来倒过来的数据了(自行了解一下小端存储)

②第二条汇编是【mov bx,[1]】 ,将[0000:0001]处的内容赋值给bx,因为bx是十六位寄存器,因此它会从[0000:0001]处取4位十六进制数,34显然是不够的(才两位),因此再取后两位56凑成5634赋值给ax。

③第三条汇编同理,不再赘述。

④此时我们举一反三,同样的内存数据,如果我们执行汇编【mov dh,[0]】,结果会怎样?

因为dh是八位寄存器(dx的高位),因此它只取[0000:0000]处的两位数据12就够了,然后赋值给dh

实例验证:

b787c04c437d4f0096760efa2ab6cb2d.png

⑤再举一反三, 同样的内存数据,如果执行汇编【add ax,[0]】,是不是可以把[0000:0000]处的数据和ax中的数据相加?

确实如此,如果执行【add al,[0]】也是同理的,相信你对地址已经很透彻了吧o(* ̄▽ ̄*)ブ

69101eb5a4324be4935e6ac857ad1846.png

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

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

相关文章

Scratch植物大战僵尸【机器人vs外星人版本】

小虎鲸Scratch资源站-免费少儿编程Scratch作品源码,素材,教程分享网站! 简介 在这个教学案例中,我们将制作一个类似《植物大战僵尸》的Scratch游戏,主题为“机器人对抗外星人”。这个版本将采用创新的角色设计,机器人将保护地球免受外星人入…

SQL题目分析:打折日期交叉问题--计算品牌总优惠天数

在电商平台的数据分析中,处理品牌促销活动的日期交叉问题是一个挑战。本文将介绍几种高级SQL技巧,用于准确计算每个品牌的总优惠天数,即使在存在日期交叉的情况下。 问题背景 我们有一个促销活动表 shop_discount,记录了不同品牌…

算法:76.最小覆盖子串

题目 链接:leetcode链接 思路分析(滑动窗口) 还是老样子,连续问题,滑动窗口哈希表 令t用的hash表为hash1,s用的hash表为hash2 利用hash表统计窗口内的个字符出现的个数,与hash1进行比较 选…

SpringBoot 消息队列RabbitMQ在代码中声明 交换机 与 队列使用注解创建

创建Fanout交换机 Configuration public class FanoutConfig {Beanpublic FanoutExchange fanoutExchange(){return new FanoutExchange("csdn.fanout");//交换机名称} }创建队列 Beanpublic Queue fanoutQueue3(){return new Queue("csdn.queue");}绑定…

Nature Climate Change | 全球土壤微生物群落调控微生物呼吸对变暖的敏感性(Q10)

本文首发于“生态学者”微信公众号! 全球变暖将加速有机物分解,从而增加土壤中二氧化碳的释放,触发正的碳-气候反馈。这种反馈的大小在很大程度上取决于有机质分解的温度敏感性(Q10)。Q10仍然是围绕土壤碳排放到大气的预测的主要不确定性来源…

软考架构-层次架构风格

一、两层C/S架构 客户端和服务器都有处理功能。处理在表示层(客户端)和数据层(服务器)进行 二、三层C/S架构 将处理功能独立出来。表示层在客户机上,功能层在应用服务器上,数据层在数据库服务器上。 三…

玄机科技浪漫绘情缘:海神缘下,一吻定情

在史莱克学院那片璀璨星空的见证下,《斗罗大陆II绝世唐门》第65集“海神缘相亲大会”的浪漫序幕,温柔地触动了每一位观众的心弦。 本集中,霍雨浩与王冬之间那段跨越重重障碍、终得相守的浪漫告白,在玄机科技独特的审美视角、精细…

强化学习Reinforcement Learning|Q-Learning|SARSA|DQN以及改进算法

一、强化学习RL 强化学习是机器学习的一个重要的分支,是一种有效的工具,在文献中被广泛用于解决MDP问题。在一个强化学习过程中,一个智能体只能通过和它所处的环境互动学习最优策略。特别地,智能体首先观察自己当前的状态&#xf…

JVM 内存模型:堆、栈、方法区讲解

1. 引言 Java 虚拟机(JVM)的内存模型是 Java 程序运行时的基础之一。JVM 内存模型主要包括 堆、栈、和 方法区。它们各自有不同的作用和管理方式,并且影响着程序的性能和稳定性。为了更好地理解 JVM 的内存管理机制,我们将结合电…

数据结构——串的定义及存储结构

串的定义 串(string)——零个或多个任意字符组成的有限序列串是内容受限的线性表 串的几个术语 子串:串中任意几个连续字符组成的子序列称为该串的子串(真子串是指不包含自身的所有子串)主串:包含子串的串…

学习笔记(一)

前言 一、对象 1、由类建模而成,是消息、数据和行为的组合 2、可以接收和发送消息,并利用消息进行彼此的交互。消息要包含传送给对象接收的信息 3、类的实例化:把类转换为对象的过程叫类的实例化。 4、对象的特性 (1) 对象有状态&#…

架构师知识梳理(七):软件工程-工程管理与开发模型

软件工程概述 软件开发生命周期 软件定义时期:包括可行性研究和详细需求分析过程,任务是确定软件开发工程必须完成的总目标,具体可分成问题定义、可行性研究、需求分析等。软件开发时期:就是软件的设计与实现,可分成…

解决VSCode文件的中文GBK和UTF-8编码之间乱码问题

NOTE:近日笔者在使用VSCode编码环境的时候,出现了中文和UTF-8两者之间乱码的问题,特编写本片文章,以作学习记录。 1.需求 用VSCode打开外部的GBK2312编码文件,想在VSCode中统一以UTF-8编码查看(笔者推荐U…

作文网源码 范文论文网模板 带会员系统+支付接口+整站数据

织梦CMS仿某中国作文网源码,文章类网站源码数据采集,采集可能会失效哦,非常漂亮的模板程序。模板divcss设计,符合W3C标准,已做好SEO优化,收录爆增,排名好,模板清爽,漂亮。本站修复了…

Java | Leetcode Java题解之第405题数字转换为十六进制数

题目: 题解: class Solution {public String toHex(int num) {if (num 0) {return "0";}StringBuffer sb new StringBuffer();for (int i 7; i > 0; i --) {int val (num >> (4 * i)) & 0xf;if (sb.length() > 0 || val …

力扣每日一题 公交站间的距离

环形公交路线上有 n 个站,按次序从 0 到 n - 1 进行编号。我们已知每一对相邻公交站之间的距离,distance[i] 表示编号为 i 的车站和编号为 (i 1) % n 的车站之间的距离。 环线上的公交车都可以按顺时针和逆时针的方向行驶。 返回乘客从出发点 start 到目…

五、Kubernetes中的存储

目录 一 configmap 1.1 configmap的功能 1.2 configmap的使用场景 1.3 configmap创建方式 1.3.1 字面值创建 1.3.2 通过文件创建 1.3.3 通过目录创建 1.3.4 通过yaml文件创建 1.3.5 configmap的使用方式 1.3.5.1 使用configmap填充环境变量 1.3.5.2 通过数据卷使用c…

深度学习自编码器 - 引言篇

序言 在深度学习的浩瀚星空中,自编码器( Autoencoder \text{Autoencoder} Autoencoder)以其独特的魅力闪耀着光芒。作为一种无监督学习技术,自编码器通过构建输入数据的压缩表示(编码)及其重构&#xff08…

鸿蒙开发之ArkTS 基础八 联合类型

联合类型 是一个变量可以存储不同的数据类型 形式灵活 使用场景,比如,考试,结果有两种形式,一种是给出具体的多少分,一种是是给出A、B、C、D、这种等级,在之前的变量中,只能存储要么分数&#…

Docker简介在Centos和Ubuntu环境下安装Docker

文章目录 1.Docker简介2.Docker镜像与容器3.安装Docker3.1 Centos环境3.2 Ubuntu环境 1.Docker简介 Docker 是一个开源的应用容器引擎,它允许开发者将应用程序及其依赖项打包到一个可移植的容器中,然后发布到任何流行的 Linux 或 Windows 操作系统上。D…