【实验具体内容】

1.使用Debug,将程序(见实验源代码)写入内存,逐条执行,观察每条指令执行后,CPU中相关寄存器中内存的变化。

2.将下面三条指令(见实验源代码)写入从2000:0开始的内存单元中,利用这三条指令计算2的8次方。

3.查看内存中存有的PC机主板上的ROM生产日期并试图修改。

4.观察下图中的实验过程,分析为何2000:0~2000:f中的内容会发生改变

【第一个实验】

(1.1)实验源代码(粘贴源代码):

机器码 汇编指令

b8 20 4e mov ax,4E20H

05 16 14 add ax,1416H

bb 00 20 mov bx,2000H

01 d8 add ax,bx

89 c3 mov bx,ax

01 d8 add ax,bx

b8 1a 00 mov ax,001AH

bb 26 00 mov bx,0026H

00 d8 add al,bl

00 dc add ah,bl

00 c7 add bh,al

b4 00 mov ah,0

00 d8 add al,bl

04 9c add al,9CH

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

Win10下可以借用Dosbox调试Debug,如下图

汇编指令debug的实验结果及分析(汇编Debug入门:承接上篇文章)(1)

用Debug下的-d命令查看1000:0之后128个内存单元中的内容

汇编指令debug的实验结果及分析(汇编Debug入门:承接上篇文章)(2)

用Debug下的-a命令以汇编语言的形式写入从1000:0开始的内存单元中

汇编指令debug的实验结果及分析(汇编Debug入门:承接上篇文章)(3)

使用Debug下的-d命令查看1000:0内存中的内容核对

汇编指令debug的实验结果及分析(汇编Debug入门:承接上篇文章)(4)

在-t命令之前注意CS:IP当前指向,这里指向073F:0102,需要修改其指向

汇编指令debug的实验结果及分析(汇编Debug入门:承接上篇文章)(5)

使用Debug下的-r命令修改CS:IP指向,如下图

汇编指令debug的实验结果及分析(汇编Debug入门:承接上篇文章)(6)

使用Debug下的-t命令逐次执行1000:0中的指令,截图如下

汇编指令debug的实验结果及分析(汇编Debug入门:承接上篇文章)(7)

汇编指令debug的实验结果及分析(汇编Debug入门:承接上篇文章)(8)

汇编指令debug的实验结果及分析(汇编Debug入门:承接上篇文章)(9)

汇编指令debug的实验结果及分析(汇编Debug入门:承接上篇文章)(10)

历次-t命令下CS:IP指向和寄存器中内容如下:

CS:IP AX BX

1000:0000 0000 0000

1000:0003 4E20 0000

1000:0006 6236 0000

1000:0009 6236 2000

1000:000B 8236 2000

1000:000D 8236 8236

1000:000F 046C 8236

1000:0012 001A 8236

1000:0015 001A 0026

1000:0017 0040 0026

1000:0019 2640 0026

1000:001B 2640 4026

1000:001D 0040 4026

1000:001F 0066 4026

1000:0021 0002 4026


(2.1)实验源代码:

mov ax,1 (从2000:0开始的内存单元)

add ax,ax

jmp 2000:0003 (观察跳到什么地方了?)

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

源代码写入过程类似上面1.2的过程,这里不再赘述,仅展示截图

汇编指令debug的实验结果及分析(汇编Debug入门:承接上篇文章)(11)

通过jmp指令,在执行一次mov ax,1后程序将在add ax,ax和jmp 2000:0003之间循环往复,直到计算出2的8次方

(下面忽略中间过程,仅关注最终结果即可)

汇编指令debug的实验结果及分析(汇编Debug入门:承接上篇文章)(12)

汇编指令debug的实验结果及分析(汇编Debug入门:承接上篇文章)(13)

汇编指令debug的实验结果及分析(汇编Debug入门:承接上篇文章)(14)

汇编指令debug的实验结果及分析(汇编Debug入门:承接上篇文章)(15)

指令执行过程纷繁复杂!


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

汇编指令debug的实验结果及分析(汇编Debug入门:承接上篇文章)(16)

由于dosbox模拟一个真实的电脑环境,故01/01/92与主板ROM不同可以理解。

【第二个实验】

(1.1)实验源代码(粘贴源代码):

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

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 内容为30F0

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

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

汇编指令debug的实验结果及分析(汇编Debug入门:承接上篇文章)(17)

修改CS:IP,使之指向2000:0000,并查看当前寄存器中内容:

汇编指令debug的实验结果及分析(汇编Debug入门:承接上篇文章)(18)

执行mov ax,ffff

汇编指令debug的实验结果及分析(汇编Debug入门:承接上篇文章)(19)

执行mov ds,ax

汇编指令debug的实验结果及分析(汇编Debug入门:承接上篇文章)(20)

执行mov ax,220

汇编指令debug的实验结果及分析(汇编Debug入门:承接上篇文章)(21)

执行mov ss,ax,此处忘记截图,可参考下图

汇编指令debug的实验结果及分析(汇编Debug入门:承接上篇文章)(22)

执行mov sp,0100

汇编指令debug的实验结果及分析(汇编Debug入门:承接上篇文章)(23)

执行mov ax,[0]

汇编指令debug的实验结果及分析(汇编Debug入门:承接上篇文章)(24)

执行add ax,[2]

汇编指令debug的实验结果及分析(汇编Debug入门:承接上篇文章)(25)

执行mov bx,[4]

汇编指令debug的实验结果及分析(汇编Debug入门:承接上篇文章)(26)

执行add bx,[6]

汇编指令debug的实验结果及分析(汇编Debug入门:承接上篇文章)(27)

执行push ax

汇编指令debug的实验结果及分析(汇编Debug入门:承接上篇文章)(28)

执行push bx

汇编指令debug的实验结果及分析(汇编Debug入门:承接上篇文章)(29)

执行pop ax

汇编指令debug的实验结果及分析(汇编Debug入门:承接上篇文章)(30)

执行pop bx

汇编指令debug的实验结果及分析(汇编Debug入门:承接上篇文章)(31)

执行push [4]

汇编指令debug的实验结果及分析(汇编Debug入门:承接上篇文章)(32)

执行push [6]

汇编指令debug的实验结果及分析(汇编Debug入门:承接上篇文章)(33)

相关填空见(1.1)


(2.1) 实验源代码(粘贴源代码):

mov ax,1000H

mov ds,ax

mov ds,[0]

add ds,ax

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

输入指令过程中,出现错误,是因为add,sub不能对段寄存器ds进行操作

汇编指令debug的实验结果及分析(汇编Debug入门:承接上篇文章)(34)

运行前三条指令是正常的(*)

汇编指令debug的实验结果及分析(汇编Debug入门:承接上篇文章)(35)

若一定要执行add ds,ax,可以采用类似向ds输入数据的方法,如下

汇编指令debug的实验结果及分析(汇编Debug入门:承接上篇文章)(36)

运行结果如下

汇编指令debug的实验结果及分析(汇编Debug入门:承接上篇文章)(37)

汇编指令debug的实验结果及分析(汇编Debug入门:承接上篇文章)(38)

由于前面在运行不完整程序的前三条指令(*)后,寄存器ds的值发生变化,导致bx的值发生变化,进而导致add bx,ax运行后bx变化,最终导致ds变化,所以在-t命令后截图中寄存器的值与之前不同,可以通过正式程序之前提前修改ds的值,使之与之前一致来消除影响。


(3.1)是因为中断的影响

【实验心得】

CS:IP指向指令的内存单元地址,CPU通过它区分指令和数据。DS存放要访问数据的段地址,CPU是不是也可以通过它来区分指令和数据呢?SS:SP时刻指向栈顶,对于PUSH指令,先进行SP=SP-2再送数据入栈;POP指令相反,先取出栈内数据再SP=SP 2。

,