【汇编语言】[BX]和loop指令(四)—— 汇编语言中的段前缀与内存保护:原理与应用解析

在这里插入图片描述

文章目录

  • 前言
  • 1. 段前缀
    • 1.1 示例演示
    • 1.2 总结
  • 2. 一段安全的空间
    • 2.1 存在的问题
    • 2.2 示例演示
      • 2.2.1 编译、链接、加载程序
      • 2.2.2 运行程序
    • 2.3 总结
  • 3. 段前缀的使用
    • 3.1 问题引入
    • 3.2 分析问题
    • 3.3 代码实现
    • 3.4 程序的改进
      • 3.4.1 分析
      • 3.4.2 代码实现
  • 结语

前言

📌

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

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

1. 段前缀

指令“mov ax,[bx]”中,内存单元的偏移地址由bx给出,而段地址默认在 ds中。我们可以在访问内存单元的指令中显式地给出内存单元的段地址所在的段寄存器。比如:

1.1 示例演示

(1)mov ax,ds:[bx]

将一个内存单元的内容送入ax,这个内存单元的长度为2字节(字单元),存放一个字,偏移地址在bx中,段地址在ds中。

(2)mov ax,cs:[bx]

将一个内存单元的内容送入ax,这个内存单元的长度为2字节(字单元),存放一个字,偏移地址在 bx中,段地址在cs中。

(3)mov ax,ss:[bx]

将一个内存单元的内容送入ax,这个内存单元的长度为2字节(字单元),存放一个字,偏移地址在bx中,段地址在ss中。

(4)mov ax,es:[bx]

将一个内存单元的内容送入ax,这个内存单元的长度为2字节(字单元),存放一个字,偏移地址在bx中,段地址在es中。

(5)mov ax,ss:[0]

将一个内存单元的内容送入ax,i这个内存单元的长度为2字节(字单元),存放一个字,偏移地址为0,段地址在ss中。

(6)mov ax,cs:[0]

将一个内存单元的内容送入ax,这个内存单元的长度为2字节(字单元),存放一个字,偏移地址为0,段地址在cs中。

1.2 总结

这些出现在访问内存单元的指令中,用于显式地指明内存单元的段地址的“ds:”、“cs:”、“ss:”或“es:”,在汇编语言中称为段前缀

2. 一段安全的空间

2.1 存在的问题

在8086式中,随意向一段内存空间写入内容是很危险的,因为这段空间中可能存放着重要的系统数据或代码。比如下面的指令:

mov ax,1000h
mov ds,ax
mov al,0
mov ds:[0],al

我们以前在Debug中,为了讲解上的方便,写过类似的指令。但这种做法是不合理的,因为之前我们并没有论证过1000:0中是否存放着重要的系统数据或代码。如果1000:0中存放着重要的系统数据或代码,“mov ds:[0],al”将其改写,将引发错误。

2.2 示例演示

比如下面的程序。

assume cs:code
code segmentmov ax,0mov ds,axmov ds:[26h],axmov ax,4c00hint 2lhcode endsend

2.2.1 编译、链接、加载程序

将源程序编辑为p7.asm,编译、连接后生成p7.exe,用Debug加载,跟踪它的运行,如下图所示。

在这里插入图片描述

上图中,我们可以看到,源程序中的“mov ds:[26h],ax”被 masm 翻译为机器码“a3 26 00”,而 Debug将这个机器码解释为“mov [0026],ax”。

可见,汇编源程序中的汇编指令“mov ds:[26h],ax”和 Debug 中的汇编指令“mov [0026],ax”同义。

2.2.2 运行程序

然后,我们看一下“mov [0026],ax”的执行结果,如下图所示。

在这里插入图片描述

上图中,是在 windows 2000 的 DOS 方式中,在 Debug 里执行“mov [0026],ax”的结果。

如果在实模式(即纯DOS方式)下执行程序p7.exe,将会引起死机。产生这种结果的原因是0:0026处存放着重要的系统数据,而“mov [0026],ax”将其改写。

2.3 总结

可见,在不能确定一段内存空间中是否存放着重要的数据或代码的时候,不能随意向其中写入内容。

不要忘记,我们是在操作系统的环境中工作,操作系统管理所有的资源,也包括内存。果我们需要向内存空间写入数据的话,要使用操作系统给我们分配的空间,而不应直接用地址任意指定内存单元,向里面写入。后面的内容我们会对“使用操作系统给我们分配的空间”有所认识。

但是,同样不能忘记,我们正在学习的是汇编语言,要通过它来获得底层的编程体验,理解计算机底层的基本工作机理。所以我们尽量直接对硬件编程,而不去理会操作系统。

这时,我们似乎面临一种选择,是在操作系统中安全、规矩地编程,还是自由、直接地用汇编语言去操作真实的硬件,了解那些早已被层层系统软件掩盖的真相?在大部分的情况下,我们选择后者,除非我们就是在学习操作系统本身的内容。

注意,我们在纯DOS方式(实模式)下,可以不理会DOS,直接用汇编语言去操作真实的硬件,因为运行在CPU 实模式下的DOS,没有能力对硬件系统进行全面、严格地管理。但在 Windows 2000、Unix 这些运行于 CPU 保护模式下的操作系统中,不理会操作系统,用汇编语言去操作真实的硬件,是根本不可能的。硬件已被这些操作系统利用CPU保护模式所提供的功能全面而严格地管理了。

在后面的课程中,我们需要直接向内存中写入内容,可我们又不希望发生上面图片中的那种情况。所以要找到一段安全的空间供我们使用。在一般的PC机中,DOS方式下,DOS 和其他合法的程序一般都不会使用0:200~0:2ff(00200h~002ffh)的 256 个字节的空间。所以,我们使用这段空间是安全的。不过为了谨慎起见,在进入DOS后,我们可以先用Debug查看一下,如果0:200~0:2ff单元的内容都是0的话,则证明DOS和其他合法的程序没有使用这里。

为什么DOS和其他合法的程序一般都不会使用0:200~0:2ff这段空间?我们将在以后的内容中讨论这个问题。




好了,我们总结一下:

(1)我们需要直接向一段内存中写入内容。
(2)这段内存空间不应存放系统或其他程序的数据或代码,否则写入操作很可能引发错误。
(3)DOS方式下,一般情况,0:200~0:2ff空间中没有系统或其他程序的数据或代码。
(4)以后,我们需要直接向一段内存中写入内容时,就使用0:200~0:2f这段空间。

3. 段前缀的使用

3.1 问题引入

我们考虑一个问题,将内存ffff:0~ffff:b单元中的数据复制到0:200~0:20b单元中。

3.2 分析问题

分析一下。

(1)0:200~0:20b单元等同于 0020:0~0020:b单元,它们描述的是同一段内存空间。

(2)复制的过程应用循环实现,简要描述如下。

初始化:

X=0

循环12次:

将ffff:x单元中的数据送入0020:x(需要用一个寄存器中转)

X=X+1

(3)在循环中,源始单元ffff:X和目标单元 0020:X的偏移地址X是变量。我们用 bx来存放。
(4)将0:200~0:20b用0020:0~0020:b 描述,就是为了使目标单元的偏移地址和源始单元的偏移地址从同一数值0开始

3.3 代码实现

程序如下。

assume cs:codecode segmentmov bx,0			;(bx)=0,偏移地址从0开始mov cx,12			;(cx)=12,循环12次s:	mov ax,0ffffhmov ds,ax			;(ds)=0ffffhmov dl,[bx]			;(dl)=((ds)*16+(bx)),将ffff:bx中的数据送入dlmov ax,0020hmov ds,ax			;(ds)=0020hmov [bx],dl			;((ds)*16+(bx))=(dl),将中d1的数据送入0020:bxinc bx				;(bx)=(bx)+1loop smov ax,4c00hint 2lhcode endsend

3.4 程序的改进

3.4.1 分析

因源始单元ffff:X和目标单元0020:X相距大于64KB,在不同的64KB段里,上面的程序中,每次循环要设置两次ds。这样做是正确的,但是效率不高。我们可以使用两个段寄存器分别存放源始单元:ffffX和目标单元0020:X的段地址,这样就可以省略循环中需要重复做12次的设置ds的程序段。

3.4.2 代码实现

改进的程序如下。

assume cs:codecode segmentmov ax,0ffffhmov ds,ax			;(ds)=0ffffhmov ax,0020hmov es,aX			;(es)=0020hmov bx,0			;(bx)=0,此时ds:bx指向ffff:0,es:bx指向0020:0mov cx,12			;(cx)=12,循环12次s:	mov dl,[bx]			;(dl)=((ds)*16+(bx)),将ffff:bx中的数据送入d1mov es:[bx],dl		;((es)*16+(bx))=(dl),将dl中的数据送入0020:bxinc bx				;(bx)=(bx)+11oop smov ax,4c00hint 21hcode endsend

改进后的程序中,使用es存放目标空间0020:0~0020:b的段地址,用ds存放源始空间ffff:0~ffff:b的段地址。在访问内存单元的指令“mov es:[bx],al”中,显式地用段前缀”es:”给出单元的段地址,这样就不必在循环中重复设置ds。

结语

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

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

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

在这里插入图片描述

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

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

相关文章

经典双指针--合并升序链表

#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h>typedef struct Node {int data;struct Node* next; } Node;Node* newNode(int data);/* 请完成下面的函数 */ Node* mergeList(Node* L1, Node* L2) {Node* head n…

dell服务器安装ESXI8

1.下载镜像在官网 2.打开ipmi&#xff08;idrac&#xff09;&#xff0c;将esxi镜像挂载&#xff0c;然后服务器开机 3.进入bios设置cpu虚拟化开启&#xff0c;进入boot设置启动选项为映像方式 4..进入安装引导界面3.加载完配置进入安装 系统提示点击继 5.选择安装磁盘进行…

【dvwa靶场:XSS系列】XSS (Stored)低-中-高级别,通关啦

更改name的文本数量限制大小&#xff0c; 其他我们只在name中进行操作 【除了低级可以在message中进行操作】 一、低级low <script>alert("假客套")</script> 二、中级middle 过滤了小写&#xff0c;咱们可以大写 <Script>alert("假客套…

从0开始学习机器学习--Day19--学习曲线

一般来说&#xff0c;如果一个算法的表现不理想&#xff0c;那么多半是因为出现了欠拟合或过拟合问题&#xff0c;这种时候我们要做的就是搞清楚出现的是偏差问题还是方差问题&#xff0c;亦或是二者皆有&#xff0c;这有助于我们精准定位问题所在。 之前&#xff0c;我们发现…

大牛直播SDK如何实现Android平台多路RTSP播放?

技术背景 好多开发者&#xff0c;希望能在Android平台实现多路RTSP播放&#xff0c;从而达到集中监控的目的&#xff0c;以下是使用大牛直播 SDK 在 Android 平台上实现 RTSP 多路播放的一般步骤&#xff1a; 初始化 SDK 在项目的build.gradle文件中添加大牛直播 SDK 的依赖。…

linux 通过apt安装软件包时出现依赖包版本不对的问题解决

通过网上查找解决办法时&#xff0c;发现的解决办法无法完美解决问题: 比如通过安装对应版本解决 如: sudo apt-get install xxx2.7.0ubuntu 这样会先卸载原先包&#xff0c;在安装对应版本的包 或者直接删除依赖的包 sudo apt-get purge xxxx 如果碰到底层包的话&#xf…

浮点数和字节数据的在线转换工具

具体请参考&#xff1a;浮点数在线转四字节字节序工具--在线将float浮点数转化为类似内存中的4字节字节序&#xff0c;支持2进制&#xff0c;10进制&#xff0c;16进制

GitLab基于Drone搭建持续集成(CI/CD)

本文介绍了如何为 Gitee 安装 Drone 服务器。服务器打包为在 DockerHub 上分发的最小 Docker 映像。 1. 准备工作 创建OAuth应用 创建 GitLab OAuth 应用。Consumer Key 和 Consumer Secret 用于授权访问极狐GitLab 资源。 ps:授权回调 URL 必须与以下格式和路径匹配&…

2024网鼎杯web1+re2 wp

这两道题属于比较简单的&#xff0c;顺道说一下&#xff0c;今年的题有点抽象&#xff0c;web不是misc&#xff0c;re不是web的&#xff0c;也有可能时代在进步&#xff0c;现在要求全栈✌了吧 web1 最开始被强网的小浣熊带偏思路了&#xff0c;进来疯狂找sql注入&#xff0c…

「C/C++」C/C++关键字 之 const常量

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

复现LLM:带你从零认识语言模型

前言 本文会以Qwen2-0.5B模型为例&#xff0c;从使用者的角度&#xff0c;从零开始一步一步的探索语言模型的推理过程。主要内容如下&#xff1a; 从使用的角度来接触模型本地运行的方式来认识模型以文本生成过程来理解模型以内部窥探的方式来解剖模型 1. 模型前台使用 1.1…

【NLP自然语言处理】深入探索Self-Attention:自注意力机制详解

目录 &#x1f354; Self-attention的特点 &#x1f354; Self-attention中的归一化概述 &#x1f354; softmax的梯度变化 3.1 softmax函数的输入分布是如何影响输出的 3.2 softmax函数在反向传播的过程中是如何梯度求导的 3.3 softmax函数出现梯度消失现象的原因 &…

Matlab 火焰识别技术

课题介绍 森林承担着为人类提供氧气以及回收二氧化碳等废弃气体的作用&#xff0c;森林保护显得尤其重要。但是每年由于火灾引起的事故不计其数&#xff0c;造成重大的损失。如果有一款监测软件&#xff0c;从硬件处获得的图像中监测是否有火焰&#xff0c;从而报警&#xff0…

Linux多线程(个人笔记)

Linux多线程 1.Linux线程概念1.1线程的优点1.2线程的缺点 2.Linux线程VS进程3.Linux线程控制3.1创建线程3.2线程tid及进程地址空间布局3.3线程终止3.4线程等待 4.分离线程5.线程互斥5.1互斥锁mutex5.2互斥锁接口5.3互斥锁实现原理5.4可重入VS线程安全 6.线程同步6.1条件变量6.2…

【EdgeBox-8120AI-TX2】Ubuntu18.04 + ROS_ Melodic + HP60C上手体验

简介&#xff1a;介绍安思疆 HP60C 深度相机在8120AI-TX2控制器上&#xff0c;TX2核心模块环境&#xff08;Ubuntu18.04&#xff09;下测试ROS驱动&#xff0c;打开摄像头图像和查看深度图和点云图&#xff0c;本文的前提条件是你的TX2里已经安装了ROS版本&#xff1a;Melodic。…

DataWind将字符串数组拆出多行的方法

摘要&#xff1a; 可视化建模中先将字符串split为array再用explode(array)即可 可视化建模 进入“可视化建模”页面 1.1 新建任务 如果团队内没有可视化建模任务。请点击“新建任务”&#xff0c;输入名称并确定。 1.2 建立数据连接 在左边栏中选择“数据连接”&#xff0c…

【大数据学习 | kafka】简述kafka的消费者consumer

1. 消费者的结构 能够在kafka中拉取数据进行消费的组件或者程序都叫做消费者。 这里面要涉及到一个动作叫做拉取。 首先我们要知道kafka这个消息队列主要的功能就是起到缓冲的作用&#xff0c;比如flume采集数据然后交给spark或者flink进行计算分析&#xff0c;但是flume采用的…

CCF ChinaOSC |「开源科学计算与系统建模openSCS专题分论坛」11月9日与您相约深圳

2024年11月9日至10日&#xff0c;以“湾区聚力 开源启智”为主题的2024年中国计算机学会中国开源大会&#xff08;CCF ChinaOSC&#xff09;将在深圳召开。大会将汇聚国内外学术界、顶尖科技企业、科研机构及开源社区的精英力量&#xff0c;共同探索人工智能技术和人类智慧的无…

人工智能——小白学习指南

知孤云出岫 目录 1. **智能评测系统**2. **个性化学习路径推荐**3. **虚拟学习助手**4. **学习行为分析**5. **数据驱动的教学决策**6. **自动化课程推荐**7. **数据隐私与安全保护** 人工智能知识点的总结和学习路线&#xff0c;以数据表格形式呈现&#xff0c;并附带在教育行…

现代Web开发:React Hooks深入解析

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 现代Web开发&#xff1a;React Hooks深入解析 现代Web开发&#xff1a;React Hooks深入解析 现代Web开发&#xff1a;React Hook…