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

相关文章

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

mysql如何查看当前连接数

《mysql如何查看当前连接数》:本文主要介绍mysql如何查看当前连接数问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql查看当前连接数查看mysql数据库允许最大连接数总结mysql查看当前连接数查看当前连接数SHOW STATUS LIKE

Nginx指令add_header和proxy_set_header的区别及说明

《Nginx指令add_header和proxy_set_header的区别及说明》:本文主要介绍Nginx指令add_header和proxy_set_header的区别及说明,具有很好的参考价... 目录Nginx指令add_header和proxy_set_header区别如何理解反向代理?proxy

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

查看Oracle数据库中UNDO表空间的使用情况(最新推荐)

《查看Oracle数据库中UNDO表空间的使用情况(最新推荐)》Oracle数据库中查看UNDO表空间使用情况的4种方法:DBA_TABLESPACES和DBA_DATA_FILES提供基本信息,V$... 目录1. 通过 DBjavascriptA_TABLESPACES 和 DBA_DATA_FILES

Python如何查看数据的类型

《Python如何查看数据的类型》:本文主要介绍Python如何查看数据的类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python查看数据的类型1. 使用 type()2. 使用 isinstance()3. 检查对象的 __class__ 属性4.

Windows命令之tasklist命令用法详解(Windows查看进程)

《Windows命令之tasklist命令用法详解(Windows查看进程)》tasklist命令显示本地计算机或远程计算机上当前正在运行的进程列表,命令结合筛选器一起使用,可以按照我们的需求进行过滤... 目录命令帮助1、基本使用2、执行原理2.1、tasklist命令无法使用3、筛选器3.1、根据PID

Android如何获取当前CPU频率和占用率

《Android如何获取当前CPU频率和占用率》最近在优化App的性能,需要获取当前CPU视频频率和占用率,所以本文小编就来和大家总结一下如何在Android中获取当前CPU频率和占用率吧... 最近在优化 App 的性能,需要获取当前 CPU视频频率和占用率,通过查询资料,大致思路如下:目前没有标准的