【实验报告】微处理器原理与应用 CPUHomework1.2 下篇 【用机器指令和汇编指令编程 Debug命令 实验心得 WMIC BIOS】

下篇 【用机器指令和汇编指令编程】

【实验具体内容 2】

1)预备知识:Debug命令的补充

1. 在D命令中使用段寄存器

格式:d 段寄存器:偏移地址,以段寄存器中的数据为段地址SA,列出从SA:偏移地址开始的内存区间中的数据

下面有四个指令案例

-r ds
:1000
-d ds:0		;查看从1000:0开始的内存区间的内容
-r ds
:1000
-d ds:10 18		;查看1000:10~1000:18中的内容
-d cs:0		;查看当前代码段中的指令代码
-d ss:0		;查看当前栈段中的内容
2. 在E,A,U命令中使用段寄存器

在E,A,U这些可以带有内存单元地址的命令中,也可以用D命令一样,用段寄存器表示内存单元的地址

以下是3个例子

-r ds
:1000
-2 ds:0 11 22 33 44 55 66	;在从1000:0开始的内存区间中写入数据
-u cs:0		;以汇编指令的形式,显示当前代码段中的代码,0代码的偏移地址
-r ds
:1000
-a ds:0		;以汇编指令的形式,向从1000:0开始的内存单元中写入指令
3. 下一条指令执行了吗?

在Debug中,用A命令写一段程序

mov ax,2000
mov ss,ax
mov sp,10		;安排2000:0000~2000:000F为栈空间,初始化栈顶

mov ax,3123
push ax
mov ax,3366
push ax		;在栈中压入两个数据

在用T命令单步执行 mov ax,2000后,显示出当前CPU各个寄存器的状态和下一步要执行的指令;

在用T命令单步执行 mov ss,ax后,显示出当前CPU各个寄存器的状态和下一步要执行的指令…,在此处有一个问题, mov ss,ax的下一条指令应该是 mov sp,10,怎么变成了mov ax,3123

通过分析我们发现,在用T命令执行 mov ss,ax的时候,其下一条指令 mov sp,10 也紧接着执行了,这与一般情况下用T命令执行一条指令后停止继续执行并显示CPU各个寄存器状态和下一步执行指令矛盾

其实不单是 mov ss,ax,还包括 mov ss,bx, mov ss,[0], pop ss等指令都会发生这种情况,且这些指令都是修改栈段寄存器SS的指令(这涉及中断机制)

总之,Debug的T命令在执行修改寄存器SS(栈段)的时候没下一条指令也紧接着被执行

【实验任务】

1)实验代码、过程、相应结果(截图)并对实验进行说明和分析

1 使用Debug,将下面的程序写入内存,逐条执行,根据指令执行后的实际运行情况填空
mov ax,ffff
mov ds,ax

mov ax,2200
mov ss,ax

mov sp,0100

mov ax,[0]		; ax = C0EA
add ax,[2]		; ax = C0FC
mov bx,[4]		; bx = 30F0		注意此处的30F0正是后面push [4]进栈的数据
add bx,[6]		; bx = 6021		注意此处的6021 - 30F0 = 2F31 正是后面push [6]进栈的数据

push ax		; sp = 00FE ; 修改的内存单元的地址是 2200:00FE ,内容为 C0FC
push bx		; sp = 00FC ; 修改的内存单元的地址是 2200:00FC ,内容为 6021
pop ax		; sp = 00FE ; ax = 6021
pop bx		; sp = 0010 ; bx = C0FC

push [4]		; sp = 00FE ; 修改的内存单元地址是 2200:00FE , 内容为 30F0
push [6]		; sp = 00FC ; 修改的内存单元地址是 2200:00FC , 内容为 2F31

在默认内存起始位置写入代码

用R命令查看执行代码前的各个寄存器状态以及下一步要执行的指令,可见CS:IP指向默认位置,不需要修改,且下一步指令为mov ax,ffff

可见mov ax,[0]执行后ax = C0EA

add ax,[2]执行后ax = C0FC

mov bx,[4]执行后bx = 30F0

add bx,[6]执行后bx = 6021

push ax执行后sp = 00FE,修改的内存单元的地址是2200:00FE,内容为C0FC

push bx执行后sp = 00FC,修改的内存单元的地址是2200:00FC,内容为6021

pop ax执行后sp = 00FE,ax = 6021

pop bx执行后sp = 0100,bx = C0FC

push [4]执行后sp = 00FE,修改的内存单元的地址是2200:00FE,内容为FFFF:4中所存的值30F0

push [6]执行后sp = 00FC,修改的内存单元的地址是2200:00FC,内容为FFFF:6中所存的值2F31

现将所有结果注释到源代码旁边,方便后续查看

2 使用Debug,将下面的程序段写入内存,逐条执行,观察每条指令执行后,CPU中相关寄存器中内容的变化(逐条执行,每条结果截图如下)
mov ax,1000H
mov ds,ax
mov ds,[0]
add ds,ax

第一、二条语句没有问题,将1000H送入ds中作为数据段的段地址

第三条语句则将10000H处的数据交给ds,后查看确实如此

第四条语句发生错误,程序也没有执行该语句

原因是段寄存器不能进行算术运算,也不能进行立即数赋值运算

可以修改该句指令为

mov bx,ds
add ax,bx
mov ds,ax
3 观察下图中的实验过程,分析为什么2000:0~2000:f中
的内容会发生改变

由上图可以发现一开始就对2000:0后的内存做了归零的初始化

但是在执行完mov ss,ax和mov sp,10之后用D命令查看内存发现出现了一些数据

通过观察不难发现这些数据有ax = 2000的值,有ip = 0108的值,有cs = 0B39的值,后面的059D应该是标志寄存器的值

结合所创建的栈结构指向这段内存可以知道是系统干的事

查阅相关资料可以发现这与内中断有关,T命令引发单步中断,CPU将一些中断例程使用的的寄存器变量自动压栈到栈中

【实验心得】

这次实验给我最大的感受就是虽然知识点并不是很多,但是整个实验上下篇的任务量并不小

在做实验,写报告的过程中要不断地翻阅王爽的《汇编语言》,不断地上网查阅相关资料,不断地发现问题解决问题,在这个过程中反反复复地使用各种知识点,最后让自己和一条条陌生的知识点成为老熟人

在实验1.2上篇中,逐个使用Debug的各种命令,R查改寄存器,D查看内存,E改写内存,U反汇编,T逐步执行,A汇编写入的一次有一次使用,让我从最初的手忙脚乱,频频犯错到最后对他们的每一种使用格式都很熟悉

CPU的14个寄存器也逐步揭开神秘的面纱,他们与R命令息息相关

D命令和E命令也让我们对内存有了更清晰的感受,每一次的查看,每一次的修改都很令人兴奋

U命令在这次实验中用的不多,但是其将一条条晦涩的机器码转换为容易理解的汇编指令时真的很酷

用E命令和A命令向内存中写入指令,用R命令修改CS:IP的指向,最后用T命令一步一步执行,IP的跳跃,指令的执行,让我初次体验到汇编的精细与严谨

在实验之外还有别的收获,比如说去了解了ROM,去看了看BIOS,还学会了用运行dxdiag来使用Direct X 诊断工具,让我对自己的计算机有了更多的了解,同时也对整个计算机的体系架构产生兴趣,因为我觉得计算机的每一个硬件都有自己的故事,每一个软件也都有自己的历史

在这样的网络时代,学习汇编或者说其他有关计算机的知识的过程并不孤单,你会看见许许多多前人的脚印,他们也会犯和你一样的错,还会将自己的知识分享出来

实验1.2下篇则是在上篇的基础上更进一步,更多的是对字存储的理解,还有DS的使用与注意事项,并最终引出栈的概念,push和pop两个相对的指令也十分有趣,SS:SP则与CS:IP很相像

最后的感受就是还需要继续努力,争取将知识融会贯通,灵活运用!

【知识点】

  • 理论上32位系统最大支持4G内存,但是实际不可能完成用到4G的内存,最大值识别3.25-3.75之间,根据windows版本不同而不同,内存识别主要与CPU的寻址有关,32位的操作系统理论上可以识别2的32次方个地址(4294967296B=4GB),但计算机还要接外设(鼠标,打印机,键盘,网卡,声卡,显卡等等)这些外设也是需要占用地址空间的
  • 通用寄存器AX,BX,CX,DX的其他意义也在实验正文中提到,在程序设计中,一般把AX用作累加寄存器(Accumulator Register)。BX用作基址寄存器(Base Register),CX用作计数寄存器(Count Register),DX用作数据寄存器(Data Register),详见实验正文
  • BIOS设置程序是存储在BIOS芯片中的,BIOS芯片是主板上一块长方形或正方形芯片,只有在开机时才可以进行设置。(一般在计算机启动时按F2或者Delete进入BIOS进行设置,一些特殊机型按F1、Esc、F12等进行设置)。BIOS设置程序主要对计算机的基本输入输出系统进行管理和设置,使系统运行在最好状态下,使用BIOS设置程序还可以排除系统故障或者诊断系统问题。有人认为既然BIOS是"程序",那它就应该是属于软件,感觉就像自己常用的Word或Excel。但也有很多人不这么认为,因为它与一般的软件还是有一些区别,而且它与硬件的联系也是相当地紧密。形象地说,BIOS应该是连接软件程序与硬件设备的一座"桥梁",负责解决硬件的即时要求。主板上的BIOS芯片或许是主板上唯一贴有标签的芯片,一般它是一块32针的双列直插式的集成电路,上面印有"BIOS"字样

参考资料: windows比cmd更强大的 WMIC命令使用详解_RiskAI的博客-CSDN博客_wmic

知乎好文:[BIOS] BIOS基本概念 - 知乎 (zhihu.com)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zenos_泽诺斯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值