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


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 后屏幕上出现一组彩色符号,继续改变其他值:

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

请添加图片描述

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


  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值