(三)《汇编语言(王爽)》 | 实验 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

相关文章

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

Python如何使用seleniumwire接管Chrome查看控制台中参数

《Python如何使用seleniumwire接管Chrome查看控制台中参数》文章介绍了如何使用Python的seleniumwire库来接管Chrome浏览器,并通过控制台查看接口参数,本文给大家... 1、cmd打开控制台,启动谷歌并制定端口号,找不到文件的加环境变量chrome.exe --rem

Debian如何查看系统版本? 7种轻松查看Debian版本信息的实用方法

《Debian如何查看系统版本?7种轻松查看Debian版本信息的实用方法》Debian是一个广泛使用的Linux发行版,用户有时需要查看其版本信息以进行系统管理、故障排除或兼容性检查,在Debia... 作为最受欢迎的 linux 发行版之一,Debian 的版本信息在日常使用和系统维护中起着至关重要的作

关于Java内存访问重排序的研究

《关于Java内存访问重排序的研究》文章主要介绍了重排序现象及其在多线程编程中的影响,包括内存可见性问题和Java内存模型中对重排序的规则... 目录什么是重排序重排序图解重排序实验as-if-serial语义内存访问重排序与内存可见性内存访问重排序与Java内存模型重排序示意表内存屏障内存屏障示意表Int

Java汇编源码如何查看环境搭建

《Java汇编源码如何查看环境搭建》:本文主要介绍如何在IntelliJIDEA开发环境中搭建字节码和汇编环境,以便更好地进行代码调优和JVM学习,首先,介绍了如何配置IntelliJIDEA以方... 目录一、简介二、在IDEA开发环境中搭建汇编环境2.1 在IDEA中搭建字节码查看环境2.1.1 搭建步

如何测试计算机的内存是否存在问题? 判断电脑内存故障的多种方法

《如何测试计算机的内存是否存在问题?判断电脑内存故障的多种方法》内存是电脑中非常重要的组件之一,如果内存出现故障,可能会导致电脑出现各种问题,如蓝屏、死机、程序崩溃等,如何判断内存是否出现故障呢?下... 如果你的电脑是崩溃、冻结还是不稳定,那么它的内存可能有问题。要进行检查,你可以使用Windows 11

使用Python检查CPU型号并弹出警告信息

《使用Python检查CPU型号并弹出警告信息》本教程将指导你如何编写一个Python程序,该程序能够在启动时检查计算机的CPU型号,如果检测到CPU型号包含“I3”,则会弹出一个警告窗口,感兴趣的小... 目录教程目标方法一所需库步骤一:安装所需库步骤二:编写python程序步骤三:运行程序注意事项方法二

C#反射编程之GetConstructor()方法解读

《C#反射编程之GetConstructor()方法解读》C#中Type类的GetConstructor()方法用于获取指定类型的构造函数,该方法有多个重载版本,可以根据不同的参数获取不同特性的构造函... 目录C# GetConstructor()方法有4个重载以GetConstructor(Type[]

Oracle数据库执行计划的查看与分析技巧

《Oracle数据库执行计划的查看与分析技巧》在Oracle数据库中,执行计划能够帮助我们深入了解SQL语句在数据库内部的执行细节,进而优化查询性能、提升系统效率,执行计划是Oracle数据库优化器为... 目录一、什么是执行计划二、查看执行计划的方法(一)使用 EXPLAIN PLAN 命令(二)通过 S

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template