本文主要是介绍(三)《汇编语言(王爽)》 | 实验 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 处的指令,并记录相关寄存器的内容:
指令 | AX | BX | IP |
---|---|---|---|
mov AX,4E20 | 4E20 | - | 0003 |
add AX,1416 | 6236 | - | 0006 |
mov BX,2000 | 6236 | 2000 | 0009 |
add AX,BX | 8236 | 2000 | 000B |
指令 | AX | BX | IP |
---|---|---|---|
mov BX,AX | 8233 | 8236 | 000D |
add AX,BX | 046C | 8236 | 000F |
mov AX,001A | 001A | 8236 | 0012 |
add BX,0026 | 001A | 0026 | 0015 |
指令 | AX | BX | IP |
---|---|---|---|
add AL,BL | 0040 | 0026 | 0017 |
add AH,BL | 2640 | 0026 | 0019 |
ADD BH,AL | 2640 | 4026 | 001B |
mov AH,00 | 0040 | 4026 | 001D |
指令 | AX | BX | IP |
---|---|---|---|
add AL,BL | 0066 | 4026 | 001F |
add AH,9C | 0002 | 4026 | 0021 |
(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。
指令执行后,相关寄存器的值:
指令 | AX | CS | IP |
---|---|---|---|
mov ax,1(地址:2000:0000) | 0001 | 2000 | 0003 |
add ax,ax(地址:2000:0003) | 0002 | 2000 | 0005 |
jmp 2000:0003 | 0002 | 2000 | 0003 |
第三条指令是 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 和内存,用机器指令和汇编指令编程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!