(三)《汇编语言(王爽)》 | 实验 1:查看 CPU 和内存,用机器指令和汇编指令编程

本文主要是介绍(三)《汇编语言(王爽)》 | 实验 1:查看 CPU 和内存,用机器指令和汇编指令编程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1. 环境配置
  • 2. 实验任务
    • 2.1 预备知识
    • 2.2 实验任务


1. 环境配置

实验内容是利用 Debug 查看 CPU 和内存,用机器指令和汇编指令编程。首先配置下 DOS 下的 Debug 环境,系统环境为 Windows10。首先在 官网 下载 DOSBox 应用,由于应用程序是 32 位的,将其安装在 C:\Program Files(x86) 目录下。然后,去该 仓库 下载相关可执行文件。

建立一个用于存放可执行文件以及后续汇编代码的文件夹,如 D:\dos\asm 和 D:\dos\masm,将上述可执行文件放入后一目录下。

在 DOSBox 安装目录下点击运行批处理文件 DOSBox 0.74-3 Options.bat,在最后位置链接刚才的目录:

[autoexec]
# Lines in this section will be run at startup.
# You can put your MOUNT lines here
mount d d:\dos	# 挂载目录
d:				# 切换目录

完成后,打开 DOSBox,切换到 masm 目录即可运行 Debug:

请添加图片描述


2. 实验任务

2.1 预备知识

  • r 指令查看、改变 CPU 寄存器的内容。如图,直接使用 r 命令可查看 CPU 寄存器内容; r 后接寄存器名称可更改原寄存器中的内容。
    请添加图片描述
  • d 指令查看内存中的内容,格式为 d 段地址:偏移地址。如图,每次显示 128 个内存单元内容,继续键入 d 命令显示下组 128 个内存单元。

在这里插入图片描述

  • e 指令改写内存中的内容,格式为 e 段地址:偏移地址 改后的内容,改后的内容从段地址和偏移决定的地址开始依次排列。如图,修改地址 1000:0 后 5 个单元的内容:

请添加图片描述

  • u 指令查看内存中机器码对应的汇编指令,格式为 u 段地址:偏移地址。如图:

请添加图片描述

  • t 指令用于 CS:IP 地址处的指令。由上图,在使用 r 指令查看寄存器内容时,界面左下角有 CS:IP 的值,及其对应的机器码和汇编指令。执行完当前指令后,IP 值会以上一条指令长度的步长递增以指向下一条待执行的指令。
  • a 指令用于以汇编指令格式往内存写入内容,对应于上述 e 指令是通过机器码往内存写入内容。如图,通过 a 指令写入三条指令并使用 u 指令查看写入结果:

请添加图片描述

2.2 实验任务

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

  • 这里以 1000:0 为起始地址写入指令,并使用 a 指令(e 指令类似)的方式写入。
  • 本实验任务中用到的指令:r 指令查看、更改 CPU 中寄存器的内容;d 指令查看内存中的内容;e 指令以机器码的形式往内存写入内容;a 指令以 汇编指令的形式往内存写入内容;u 将内存中的机器指令翻译成汇编指令;t 指令执行一条汇编指令。

首先,使用 a 指令以 1000:0 为起始地址写入所有汇编指令,并使用 u 指令翻译:

请添加图片描述
使用 r 指令修改寄存器 CS 和 IP 的内容,使其指向地址 1000:0:

请添加图片描述

最后,使用 t 指令开始执行 1000:0000 处的指令,并记录相关寄存器的内容:

请添加图片描述

指令AXBXIP
mov AX,4E204E20-0003
add AX,14166236-0006
mov BX,2000623620000009
add AX,BX82362000000B

请添加图片描述

指令AXBXIP
mov BX,AX82338236000D
add AX,BX046C8236000F
mov AX,001A001A82360012
add BX,0026001A00260015

请添加图片描述

指令AXBXIP
add AL,BL004000260017
add AH,BL264000260019
ADD BH,AL26404026001B
mov AH,0000404026001D

请添加图片描述

指令AXBXIP
add AL,BL00664026001F
add AH,9C000240260021

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

mov ax,1
add ax,ax
jmp 2000:0003
  • 使用 r 指令修改 CS 寄存器和 IP 寄存器的内容。
  • 或使用 jmp 指令。jmp 段地址:偏移地址,如 jmp 2AE3:3 后,CS=2AE3H、IP=0003H,并且 CPU 将从 2AE3:3 处读取指令并执行;或 jmp 某一合法寄存器名,如 jmp AX 后,IP=AX。

指令执行后,相关寄存器的值:

指令AXCSIP
mov ax,1(地址:2000:0000)000120000003
add ax,ax(地址:2000:0003)000220000005
jmp 2000:0003000220000003

第三条指令是 jmp 2000:0003,执行后 CS=2000、IP=0003,而该位置存储的指令是 add ax,ax。所以,CPU 退回去执行第二条指令,以此构成一个循环,且循环一次 ax 寄存器的值翻倍。

首先,在 2000:0000 处写入三条指令:

请添加图片描述
然后,使用 r 指令修改 CS=2000、IP=0000,并使用 t 指令执行:

请添加图片描述
以此使用 t 指令执行下去,得到 2 的 8 次方,AX=0100:

请添加图片描述
(3)在内存 FFF00H~FFFFF 的某一个单元中,找到一个表示生产日期的符号并试图改变它。

请添加图片描述
上图的 30 31 2F-30 31 2F 39 32 为字符的 ASCII 码,对应于字符串 01/01/92。地址为 FFF0:00F5~FFF0:00FC,尝试使用指令 e 修改它:

请添加图片描述
修改失败,说明这段内存是只读的。

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

-e B810:0000 01 01 02 02 03 03 04 04

并填写不同数据,观察产生的现象。

请添加图片描述
执行完指令 e 后屏幕上出现一组彩色符号,继续改变其他值:

请添加图片描述
改变地址后,写入上组数据:

请添加图片描述

由上述结果可以得到一般规律:上述操作的内存区域与显示器的显示有关,并且段地址控制显示器的显示位置,即段地址位于特定范围内时,往该范围写入指令时会在显示器显示相应图案。此外,写入的内容控制最终在显示器显示的图案以及颜色。


这篇关于(三)《汇编语言(王爽)》 | 实验 1:查看 CPU 和内存,用机器指令和汇编指令编程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/573702

相关文章

Linux下进程的CPU配置与线程绑定过程

《Linux下进程的CPU配置与线程绑定过程》本文介绍Linux系统中基于进程和线程的CPU配置方法,通过taskset命令和pthread库调整亲和力,将进程/线程绑定到特定CPU核心以优化资源分配... 目录1 基于进程的CPU配置1.1 对CPU亲和力的配置1.2 绑定进程到指定CPU核上运行2 基于

Mysql实现范围分区表(新增、删除、重组、查看)

《Mysql实现范围分区表(新增、删除、重组、查看)》MySQL分区表的四种类型(范围、哈希、列表、键值),主要介绍了范围分区的创建、查询、添加、删除及重组织操作,具有一定的参考价值,感兴趣的可以了解... 目录一、mysql分区表分类二、范围分区(Range Partitioning1、新建分区表:2、分

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java内存分配与JVM参数详解(推荐)

《Java内存分配与JVM参数详解(推荐)》本文详解JVM内存结构与参数调整,涵盖堆分代、元空间、GC选择及优化策略,帮助开发者提升性能、避免内存泄漏,本文给大家介绍Java内存分配与JVM参数详解,... 目录引言JVM内存结构JVM参数概述堆内存分配年轻代与老年代调整堆内存大小调整年轻代与老年代比例元空

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

Python包管理工具核心指令uvx举例详细解析

《Python包管理工具核心指令uvx举例详细解析》:本文主要介绍Python包管理工具核心指令uvx的相关资料,uvx是uv工具链中用于临时运行Python命令行工具的高效执行器,依托Rust实... 目录一、uvx 的定位与核心功能二、uvx 的典型应用场景三、uvx 与传统工具对比四、uvx 的技术实

Windows的CMD窗口如何查看并杀死nginx进程

《Windows的CMD窗口如何查看并杀死nginx进程》:本文主要介绍Windows的CMD窗口如何查看并杀死nginx进程问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows的CMD窗口查看并杀死nginx进程开启nginx查看nginx进程停止nginx服务

Redis过期删除机制与内存淘汰策略的解析指南

《Redis过期删除机制与内存淘汰策略的解析指南》在使用Redis构建缓存系统时,很多开发者只设置了EXPIRE但却忽略了背后Redis的过期删除机制与内存淘汰策略,下面小编就来和大家详细介绍一下... 目录1、简述2、Redis http://www.chinasem.cn的过期删除策略(Key Expir

Java进程CPU使用率过高排查步骤详细讲解

《Java进程CPU使用率过高排查步骤详细讲解》:本文主要介绍Java进程CPU使用率过高排查的相关资料,针对Java进程CPU使用率高的问题,我们可以遵循以下步骤进行排查和优化,文中通过代码介绍... 目录前言一、初步定位问题1.1 确认进程状态1.2 确定Java进程ID1.3 快速生成线程堆栈二、分析