实验1 用机器指令和汇编指令编程
一、实验结论
实验一:
实验任务(1):使用Debug,将下面的程序段写入内存,逐条执行,观察每条指令执行后CPU中相关寄存器中内容的变化。
按照要求,机器码较多,因此实验只用到前四行。
b8 20 4e mov ax,4E20H
05 16 14 add ax,1416H
bb 00 20 mov ax,2000H
01 d8 add ax,bx
分别使用e命令和a命令两种方式进行程序写入:
使用e命令的方式:
首先对使用r指令和d指令对寄存器内容进行查看,确认寄存器cs和ip的内容,并且将cs:ip指向的区域进行了修改。
使用e命令写入命令,并且使用u命令反汇编
使用t指令单步调试
使用a命令的方式:
首先输入a指令进行内存写入命令。接着对使用r指令对寄存器内容进行查看,确认寄存器cs和ip的内容,并且将cs:ip指向的区域进行了修改。
修改之后再次使用r指令对修改结果进行确认。
使用t指令进行单步调试
使用u命令进行反汇编
实验任务(2):将下面3条指令写入从2000:0开始的内存单元中,利用这3条指令计算2的8次方。
mov ax,1 add ax,ax jmp 2000:0003
使用a指令写入命令,并且对于cs:ip指向进行修改,使用r指令查看寄存器内容
开始调试
调试结果
实验任务(3): PC机主板上的ROM中写有一个生产日期,在内存FFF00H~FFFFFH的某几个单元中,请找到这个生产日期并试图改变它。
使用d命令查看内存区域处于FFF00H~FFFFFH之间的内容
发现了位于FF0:00F0处的疑似日期的地方,1992年1月1日是生产日期(模拟)
紧接着使用e命令尝试进行修改
修改之后进行确认,发现并没有发生改变。因为该段地址内存空间输入ROM。而ROM是只读存储器,其中的内容是只读内容,只读存储器内内容不可写。因此无法修改日期。
实验任务(4):向内存从B8100H的单元中填写数据
-e B810:0000 01 01 02 02 03 03 04 04
尝试先不改变地址,改变数据内容
观察到出现了彩色的图像于屏幕之上。地址不变的情况下,图像内容发生了变化。
紧接着,不改变数据内容,改变地址:
可以发现显示的图像固定了,但是位置发生了变化。
原因是写入的这段地址区间A0000H-BFFFFH是一个显存地址段。向其中写入内容会进行对应图像显示。
实验二:
实验任务(1):使用Debug,将下面的程序段写入内存,逐条执行,根据指令执行后的实际运行情况填空。
mov ax,0022 mov ds,ax mov ax,2200 mov ss,ax mov sp,0100 mov ax,[0] ; ax=5150 add ax,[2] ; ax=A4A2 mov bx,[4] ; bx=5554 add bx,[6] ; bx=ACAA push ax ; sp=00FE;修改的内存单元的地址是2200:00FE,内容为A4A2 push bx ; sp=00FC;修改的内存单元的地址是2200:00FC,内容为ACAA pop ax ; sp=00FE;ax=ACAA pop bx ; sp=0100;bx=A4A2 push [4] ; sp=00FE;修改的内存单元的地址是2200:00FE,内容为5554 push [6] ; sp=00FC;修改的内存单元的地址是2200:00FC,内容为5756
为了实验的方便,需要进行预处理:先使用e命令修改内存单元0022:0~0022:f 中的数据,然后使用d命令检验修改是否成功。
使用a命令输入指令
使用t命令单步调试
根据指令执行的实际情况,对各个寄存器的结果进行填空。对于③单步调试的观察,与理论上分析的结果进行比较,检验是否一致,如不一致,分析原因。
根据观察,单步调试的结果和理论分析情况是一致的。
填写的内容:
mov ax,0022
mov ds,ax
mov ax,2200
mov ss,ax
mov sp,0100
mov ax,[0] ; ax=5150
add ax,[2] ; ax=A4A2
mov bx,[4] ; bx=5554
add bx,[6] ; bx=ACAA
push ax ; sp=00FE;修改的内存单元的地址是2200:00FE,内容为A4A2
push bx ; sp=00FC;修改的内存单元的地址是2200:00FC,内容为ACAA
pop ax ; sp=00FE;ax=ACAA
pop bx ; sp=0100;bx=A4A2
push [4] ; sp=00FE;修改的内存单元的地址是2200:00FE,内容为5554
push [6] ; sp=00FC;修改的内存单元的地址是2200:00FC,内容为5756
实验任务(2):使用a命令输入指令,并用e命令修改2000:0~2000:f的值,再通过d命令查看修改后的数据。
使用a命令输入指令
使用e命令修改:
查看寄存器
单步调试
单步调试每一行汇编指令的截图。每一条指令单步调试后,都使用 d 命令查看2000:0~2000:f 的值。观察每一条指令执行后相关寄存器值的变化,及 2000:0~2000:f 单元值的变化,并思考原因。
mov指令让2000进入了寄存器ax
ax的内容进入ss,ss也变成2000
(mov sp,10)sp被设置成了10,ax变成了3123
寄存器ax内容入栈,3123入栈
把3366放入寄存器ax
寄存器ax内容再次入栈
单步调试的过程中,寄存器的内容入栈导致了2000:0-2000:f之间内容发生了变化。
前三行指令的意思是
mov ax,2000 意思是将2000H存入ax寄存器中
mov ss,ax 意思是将ax寄存器内容转入ss寄存器中,设置了栈的段地址为2000H
mov sp,10 意思是把sp内容设置为10H,这里设置的其实是地址偏移量为10H(这条指令隐藏的原因是因为单步调试的机制,中断之后自动执行了该条指令)
根据内存单元内容变化,不难发现
CS=073F IP=0108已经按照高位偏移方式存储在内存单元中。
初始状态栈为空栈,因此:
初始时栈顶为2000:0010 H
初始时栈底为2000:000F H
变化的原因:Debug 执行t命令修改寄存器SS的内容之后,下一条指令也会接着执行。
这段给定空间的地址在指令执行的时候转存了ax的值,并且存储了cs和ip的值。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)