【汇编语言】寄存器(CPU工作原理)(七)—— 查看CPU和内存,用机器指令和汇编指令编程

在这里插入图片描述

文章目录

  • 前言
  • 1. 预备知识:Debug的使用
    • 1.1 什么是Debug?
    • 1.2 我们用到的Debug功能
    • 1.3 进入Debug
      • 1.3.1 对于16位或者32位机器的进入方式
      • 1.3.2 对于64位机器的进入方式
    • 1.4 R命令
    • 1.5 D命令
    • 1.6 E命令
    • 1.7 U命令
    • 1.8 T命令
    • 1.9 A命令
  • 2. 总结
  • 3. 实操练习
  • 结语

前言

📌

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

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

文章主要内容:基于实验内容,详细展示如何查看CPU和内存以及通过机器指令和汇编指令编程。

1. 预备知识:Debug的使用

我们以后所有的实验中,都将用到Debug程序,首先学习一下它的主要用法。

1.1 什么是Debug?

Debug是DOS、Windows都提供的实模式(8086方式)程序的调试工具。使用它,可以查看CPU各种寄存器中的内容、内存的情况和在机器码级跟踪程序的运行。

1.2 我们用到的Debug功能

  • 用Debug的R命令查看、改变CPU寄存器的内容
  • 用Debug的D命令查看内存中的内容
  • 用Debug的E命令改写内存中的内容
  • 用Debug的U命令将内存中的机器指令翻译成汇编指令
  • 用Debug的T命令执行一条机器指令
  • 用Debug的A命令以汇编指令的格式在内存中写入一条机器指令

Debug的命令比较多,共有20多个,但这6个命令是和汇编学习密切相关的。在以后的实验中,我们还会用到一个P命令。

1.3 进入Debug

  • debug是Windows 16位或者32位机器上的一款调试工具。也就是说,在WindowsXP及以前的机器上都有debug,直接Win+X debug就可以调出;在之后的32位机也有;但是在之后的64位机器上不存在,即使有,也无法运行不必尝试到底能不能运行,绝对不能
  • 相似的,微软的masm也无法在64位版本的系统上运行。
  • 可以通过安装dosbox来虚拟一个DOS环境或者使用WindowsXP(虚拟机即可)的方式来使用debug和masm。

1.3.1 对于16位或者32位机器的进入方式

Debug是在 DOS方式下使用的程序。我们在进入Debug前,应先进入到DOS方式。
用以下方式可以进入 DOS。

  • 形式1:重新启动计算机,进入DOS方式,此时进入的是实模式的DOS。
  • 形式2:在 Windows 中进入 DOS 方式,此时进入的是虚拟 8086 模式的 DOS。

下面说明在 Windows 2000中进入 Debug 的一种方法,在其它 Windows 系统中进入的方法与此类似。
选择【开始】菜单中的【运行】命令,如图2.28所示,打开【运行】对话框,如图2.29所示,在文本框中输入“command”后,单击【确定】按钮。

在这里插入图片描述

进入DOS方式后,如果显示为窗口方式,可以按下At+Enter键将窗口变为全屏方式。然后运行 Debug 程序,如图2.30所示。这个程序在不同的 Windows 系统中所在的路径不尽相同,在 Windows2000中通常在c:\winnt\system下。由于系统指定了搜索路径,所以在任何一个路径中都可以运行。

在这里插入图片描述

1.3.2 对于64位机器的进入方式

可以使用虚拟机进入或者使用DOSBox软件来虚拟一个DOS环境。由于虚拟机比较繁琐,因此本文介绍通过DOSBox软件(该软件是免费的)来进入DOS环境。

一、下载相关软件与配置文件

  1. 下载DOSBox:

    DOSBox 官网下载地址

    按照如下两个步骤即可下载该软件的安装包

    在这里插入图片描述

    在这里插入图片描述

  2. 下载汇编语言学习所需的各种执行文件:
    链接:https://pan.baidu.com/s/1jnibqovtiwKJKTrniFPS_Q
    提取码:nfwo
    在这里插入图片描述

二、软件安装

  1. 安装DOSBox:

双击上面在官网上下载的安装包,注意不要安装在C盘,我安装的是D盘

  1. 安装汇编语言学习时所需要的各种文件

解压上面百度网盘中的 MASM.zip 压缩包,将解压后的 MASM 文件夹跟 “DOSBox 的安装目录” 置于同一目录下

在这里插入图片描述

三、启动、配置和运行

  1. 启动

双击桌面的DOSBox快捷方式,启动DOSBox

在这里插入图片描述

此时会弹出两个窗口,我们只需要其中一个,另一个最小化即可

在这里插入图片描述

  1. 配置

如图所示,此时为盘符 Z (虚拟磁盘);首先需要对 debug.exe 文件所在的磁盘(我的 MASM.zip 的解压盘:完整的路径为 D:\DOSBox\MASM)做一次 mount(挂载)操作,比如我们将其挂载到 DOSbox 的 C 盘:

在这里插入图片描述

  1. 运行

在这里插入图片描述

1.4 R命令

在这里插入图片描述

在这里我们可以看到所有寄存器的里面的内容




如下图,在所有寄存器的下方,Debug还列出了CS:IP所指向的内存单元处所存放的机器码,并将它翻译为汇编指令。

在这里插入图片描述

可以看到,CS:IP所指向的内存单元为0CA2:0100,此处存放的机器码为027548,对应的汇编指令为ADD DH,[DI+48](这条指令的含义我们还不知道,先不必深究)。




修改一个寄存器中的值:比如AX中的值,可用R命令后加寄存器名来进行,输入“r ax”后按 Enter 键,将出现“:”作为输入提示,在后面输入要写入的数据后按Enter 键,即完成了对 AX中内容的修改。若想看一下修改的结果,可再用R命令查看,如图下所示。

在这里插入图片描述

在上图中,一进入Debug,用R命令查看,CS:IP指向0B39:0100,此处存放的机器码为 40,对应的汇编指令是INC AX;

接着,用R命令将IP修改为200,则CS:IP指向0B39:0200,此处存放的机器码为对应的汇编指令是POP BX;

接着,用R命令将CS修改为ff00,则CS:IP指向ff00:0200,此处存放的机器码为51,对应的汇编指令是 PUSH CX。

1.5 D命令

用Debug的D命令,可以查看内存中的内容,D命令的格式较多,这里只介绍在本次实验中用到的格式。
如果我们想知道内存10000H处的内容,可以用“d段地址:偏移地址”的格式来查看,如下图所示。

在这里插入图片描述

使用“d段地址:偏移地址”的格式,Debug将列出从指定内存单元开始的128个内存单元的内容。在上图中,在使用d 1000:0后,Debug列出了1000:0~1000:7F中的内容。

使用D命令,Debug将输出3部分内容(如上图所示)。

① 中间是从指定地址开始的128个内存单元的内容,用十六进制的格式输出,每行的输出从16的整数倍的地址开始,最多输出16个单元的内容。(注意在每行的中间有一个“-”它将每行的输出分为两部分,这样便于查看。)

② 左边是每行的起始地址

③ 右边是每个内存单元中的数据对应的可显示的ASCI码字符。

❗❗❗注意

我们看到的内存中的内容,在不同的计算机中是不一样的,也可能每次用Debug看到的内容都不相同,因为我们用Debug看到的都是原来就在内存中的内容,这些内容受随时都有可能变化的系统环境的影响。当然,我们也可以改变内存、寄存器中的内容。




也可以指定D命令的查看范围,此时采用“d段地址:起始偏移地址 结尾偏移地址”的格式。比如要看1000:0~1000:9中的内容,可以用“d1000:0 9”实现,如下图所示。

在这里插入图片描述

1.6 E命令

可以使用E命令来改写内存中的内容,比如,要将内存1000:0~1000:9单元中的内容分别写为0、1、2、3、4、5、6、7、8、9,可以用“e起始地址 数据 数据 数据……”的格式来进行,如下图所示。

在这里插入图片描述




也可以采用提问的方式来一个一个地改写内存中的内容,如下图所示。

在这里插入图片描述

如上图中,可以用E命令以提问的方式来逐个地修改从某一地址开始的内存单元中的内容,以从1000:10单元开始为例,步骤如下:

  1. 输入e 1000:10,按 Enter 键。
  2. 显示起始地址 1000:0010和第一单元(即 1000:0010单元)的原始内容:6D,然后光标停在“.”的后面提示输入想要写入的数据,此时可以有两个选择:其一为输入数据(我们输入的是0),然后按空格键,即用输入的数据改写当前的内存单元;其二为不输入数据,直接按空格键,则不对当前内存单元进行改写。
  3. 当前单元处理完成后(不论是改写或没有改写,只要按了空格键,就表示处理完成),Debug将接着显示下一个内存单元的原始内容,并提示进行修改,读者可以用同样的方法处理。
  4. 所有希望改写的内存单元改写完毕后,按Enter键,E命令操作结束。



可以用E命令向内存中写入字符,比如,用E命令从内存1000:0开始写入数值1、字符“a”、数值 2、字符“b”、数值 3、字符“c”,可采用下图中所示的方法进行。

在这里插入图片描述

从上图中可以看出,Debug对E命令的执行结果是,向1000:0、1000:2、1000:4单元中写入数值1、2、3,向1000:1、1000:3、1000:5单元中写入字符“a”、“b”、“c”的ASCII码值:61H、62H、63H。




也可以用E命令向内存中写入字符串,比如,用E命令从内存1000:0开始写入:数值 1、字符串“a+b”、数值 2、字符串“c++”、字符 3、字符串“IBM”,如下图所示。

在这里插入图片描述

1.7 U命令

如何向内存中写入机器码呢?我们知道,机器码也是数据,当然可以用E命令将机器码写入内存。比如我们要从内存1000:0单元开始写入这样一段机器码:

在这里插入图片描述

可用如下图中所示的方法进行。

在这里插入图片描述




然后如何查看写入的或内存中原有的机器码所对应的汇编指令呢?可以使用U命令。比如可以用U命令将从1000:0开始的内存单元中的内容翻译为汇编指令,并显示出来,如下图所示。

在这里插入图片描述

上图中,首先用E命令向从1000:0开始的内存单元中写入了8个字节的机器码;然后用D命令查看内存1000:0~1000:1f中的数据(从数据的角度看一下写入的内容);最后用U命令查看从 1000:0开始的内存单元中的机器指令和它们所对应的汇编指令。

U命令的显示输出分为3部分,每一条机器指令的地址、机器指令、机器指令所对应的汇编指令。我们可以看到:

  • 1000:0 处存放的是写入的机器码 b8 01 00 所组成的机器指令,对应的汇编指令是mov ax,l;

  • 1000:3 处存放的是写入的机器码 69 02 00 所组成的机器指令,对应的汇编指令是mov cx,2;

  • 1000:6 处存放的是写入的机器码 01 c8 所组成的机器指令,对应的汇编指令是add ax,CX;

  • 1000:8 处存放的是内存中的机器码 03 49 42所组成的机器指令,对应的汇编指令是add cx,[bx+di+42]。

由此,我们可以再一次看到内存中的数据和代码没有任何区别,关键在于如何解释

1.8 T命令

如何执行我们写入的机器指令呢?使用Debug的T命令可以执行一条或多条指令,简单地使用T命令,可以执行CS:IP指向的指令,如下图所示。

在这里插入图片描述

上图,首先用E命令向从1000:0开始的内存单元中写入了8个字节的机器码:然后用R命令查看CPU存器的态,可以看到,CS=0b39H、IP=0100H,指向内存0b39:0100;若要用T命令控制CPU执行我们写到1000:0的指令,必须先让CS:IP指向1000:0;接着用R命令修改CS、IP中的内容,使CS:IP指向1000:0

完成上面的步骤后,就可以使用T命令来执行我们写入的指令了(此时,CS:IP指向我们的指令所在的内存单元)。执行T命令后,CPU执行CS:IP指向的指令,则1000:0处的指令b8 01 00(mov ax,0001)得到执行,指令执行后,Debug 显示输出 CPU中寄存器的状态。

注意,指令执行后,AX中的内容被改写为1,IP改变为IP+3(因为movax,0001的指令长度为3个字节),CS:IP指向下一条指令。

接着,我们可以继续使用T命令执行下面的指令,如下图所示。

在这里插入图片描述

在用T命令执行指令时,注意每条指令执行后,CPU相关寄存器内容的变化

1.9 A命令

前面我们使用E命令写入机器指令,这样做很不方便,最好能直接以汇编指令的形式写入指令。为此,Debug 提供了A命令。A命令的使用方法如下图所示。

在这里插入图片描述

上图中,首先用A命令,以汇编语言向从1000:0开始的内存单元中写入了几条指令,然后用D命令查看A命令的执行结果。可以看到,在使用A命令写入指令时,我们输入的是汇编指令,Debug 将这些汇编指令翻译为对应的机器指令,将它们的机器码写入内存。

使用A命令写入汇编指令时,在给出的起始地址后直接按Enter键表示操作结束。

2. 总结

在这里插入图片描述

3. 实操练习

(1) 使用 Debug,将下面的程序段写入内存,逐条执行,观察每条指令执行后CPU中相关寄存器中内容的变化。

在这里插入图片描述

提示,可用E命令和A命令以两种方式将指令写入内存。注意用T命令执行时,CS:IP 的指向。

(2) 将下面3条指令写入从2000:0开始的内存单元中,利用这3条指令计算2的8次方。

在这里插入图片描述

(3) 查看内存中的内容。

PC机主板上的ROM中写有一个生产日期,在内存FFF00H~FFFFFH的某几个单元中,请找到这个生产日期并试图改变它。

(4) 向内存从 B8100H 开始的单元中填写数据,如:

在这里插入图片描述

请读者先填写不同的数据,观察产生的现象;再改变填写的地址,观察产生的现象。

结语

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

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

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

在这里插入图片描述

参考
王爽《汇编语言》(第四版)编程环境搭建

64 位 Windows 下配置汇编用的 Debug 环境(win7和win10都适用) - 简书 (jianshu.com)

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

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

相关文章

grpc的python使用

RPC 什么是 RPC ? RPC(Remote Procedure Call)远程过程调用,是一种计算机通信协议,允许一个程序(客户端)通过网络向另一个程序(服务器)请求服务,而无需了解…

笔试算法总结

文章目录 题目1题目2题目3题目4 题目1 使用 StringBuilder 模拟栈的行为&#xff0c;通过判断相邻2个字符是否相同&#xff0c;如果相同就进行删除 public class Main {public static String fun(String s) {if (s null || s.length() < 1) return s;StringBuilder builde…

前端开发基础NodeJS+NPM基本使用(零基础入门)

文章目录 1、Nodejs基础1.1、NodeJs简介1.2、下载安装文件1.3、安装NodeJS1.4、验证安装2、Node.js 创建第一个应用2.1、说明2.2、创建服务脚本2.3、执行运行代码2.4、测试访问3、npm 基本使用3.1、测试安装3.2、配置淘宝npm镜像3.3.1、本地安装3.3.2、全局安装3.4、查看安装信…

【网络】详解TCP协议的流量控制和拥塞控制

【网络】详解TCP协议的流量控制和拥塞控制 一. 流量控制模型窗口探测 二. 拥塞控制模型 总结 一. 流量控制 流量控制主要考虑的是接收方的处理速度。 接收端处理数据的速度是有限的.。如果发送端发的太快, 导致接收端的缓冲区被打满, 这个时候如果发送端继续发送, 就会造成丢包…

IP地址如何支持远程办公?

由于当今社会经济的飞速发展&#xff0c;各个方向的业务都不免接触到跨省、跨市以及跨国办公的需要&#xff0c;随之而来的远程操作的不方便&#xff0c;加载缓慢&#xff0c;传输文件时间过长等困难&#xff0c;如何在万里之外实现远程办公呢&#xff1f;我们以以下几点进行阐…

【GaussDB】产品简介

产品定位 GaussDB 200是一款具备分析及混合负载能力的分布式数据库&#xff0c;支持x86和Kunpeng硬件架构&#xff0c;支持行存储与列存储&#xff0c;提供PB(Petabyte)级数据分析能力、多模分析能力和实时处理能力&#xff0c;用于数据仓库、数据集市、实时分析、实时决策和混…

3DCAT实时云渲染赋能2024广东旅博会智慧文旅元宇宙体验馆上线!

广东国际旅游产业博览会&#xff08;以下简称“旅博会”&#xff09;是广东省倾力打造的省级展会品牌&#xff0c;自2009年独立成展至今已成功举办十五届。2024广东旅博会于9月13—15日在广州中国进出口商品交易会展馆A区举办&#xff0c;线上旅博会“智慧文旅元宇宙体验馆”于…

力扣21~30题

21题&#xff08;简单&#xff09;&#xff1a; 分析&#xff1a; 按要求照做就好了&#xff0c;这种链表基本操作适合用c写&#xff0c;python用起来真的很奇怪 python代码&#xff1a; # Definition for singly-linked list. # class ListNode: # def __init__(self, v…

Parallels Desktop意外退出,Parallels Desktop安装软件很卡闪退怎么办?

Parallels Desktop是目前很优秀的虚拟机软件&#xff0c;操作简单&#xff0c;兼容性强而且安装也非常方便&#xff0c;备受苹果用户的喜爱和满意。然而&#xff0c;部分用户在使用Parallels Desktop的时候&#xff0c;会遇到意外退出或终端关机的情况&#xff0c;这不仅会影响…

利用 Llama 3.1模型 + Dify开源LLM应用开发平台,在你的Windows环境中搭建一套AI工作流

文章目录 1. 什么是Ollama&#xff1f;2. 什么是Dify&#xff1f;3. 下载Ollama4. 安装Ollama5. Ollama Model library模型库6. 本地部署Llama 3.1模型7. 安装Docker Desktop8. 使用Docker-Compose部署Dify9. 注册Dify账号10. 集成本地部署的 Llama 3.1模型11. 集成智谱AI大模型…

图像分类-demo(Lenet),tensorflow和Alexnet

目录 demo(Lenet) 代码实现基本步骤&#xff1a; TensorFlow 一、核心概念 二、主要特点 三、简单实现 参数: 模型编译 模型训练 模型评估 Alexnet model.py train.py predict.py demo(Lenet) PyTorch提供了一个名为“torchvision”的附加库&#xff0c;其中包含…

修复PDF打印速度慢

详细问题&#xff1a; 当您尝试将 PDF 文件打印到本地或网络打印机时&#xff0c;打印需要很长时间&#xff0c;因为发送打印作业后&#xff0c;打印机开始打印的速度非常慢&#xff0c;在打印任务中可以看到打印传输的数据在缓慢增长。 从其他程序打印时也不会出现打印速度慢…

AI大模型 向量Embeddings+向量数据库实现文搜文、图搜图

文搜文、图搜图介绍: 文搜文 &#xff1a;即文本搜索文本&#xff0c;是指通过输入关键词或短语&#xff0c;在大量文本数据中检索出与之相关的内容 。 搜 索引擎&#xff08;百度、谷歌、 360 &#xff09; 、 文档管理系统 、 电商搜索 。 图搜图 &#xff1a;即图像搜…

从零开始搭建一个node.js后端服务项目

目录 一、下载node.js及配置环境 二、搭建node.js项目及安装express框架 三、集成nodemon&#xff0c;实现代码热部署 四、Express 应用程序生成器 一、下载node.js及配置环境 网上很多安装教程&#xff0c;此处就不再赘述了 版本信息 C:\Users\XXX>node -v v20.15.0…

IDEA Sping Boot 多配置文件application Maven动态切换

新建application-dev.yml与application-prod.yml pom.xml文件下添加profiles等 让idea识别出配置文件 <profiles><profile><id>dev</id><properties><!-- 环境标识&#xff0c;需要与配置文件的名称相对应 --><profiles.active>dev&…

欧科云链研究院深掘链上数据:洞察未来Web3的隐秘价值

目前链上数据正处于迈向下一个爆发的重要时刻。 随着Web3行业发展&#xff0c;公链数量呈现爆发式的增长&#xff0c;链上积聚的财富效应&#xff0c;特别是由行业热点话题引领的链上交互行为爆发式增长带来了巨量的链上数据&#xff0c;这些数据构筑了一个行为透明但与物理世…

(32)噪声信号的时域分析:均值、方差、与功率

文章目录 前言一、生成噪声信号并画图二、计算信号的均值、方差、与功率三、结果分析 前言 本文对叠加了高斯白噪声的一段整周期余弦信号进行时域分析&#xff0c;使用MATLAB进行信号生成&#xff0c;并计算其均值、方差、与功率。最后给出对计算结果的分析&#xff0c;阐明均…

开源新生活,社区齐乐活:COSCon'24 社区合作和开源集市招募中,诚邀广大社区参与!...

一年一度的开源盛会&#xff0c;COSCon24第九届中国开源年会暨开源社10周年嘉年华&#xff0c;将于11月2-3日&#xff0c;在北京•中关村国家自主创新示范区展示中心召开&#xff01;本次大会的主题是&#xff1a;「Open Source&#xff0c;Open Life | 开源新生活」&#xff0…

电脑无线网wifi和有线网同时使用(内网+外网同时使用)

一、要求 我这里以无线网wifi为外网&#xff0c;有线网卡为内网为例&#xff1a; 一、基本信息 无线wifi&#xff08;外网&#xff09;&#xff1a;ip是192.168.179.235&#xff0c;网关是192.168.179.95有线网&#xff08;内网&#xff09;&#xff1a;ip是192.168.10.25&…