实验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的值。

 

posted @ 2020-10-13 19:37  无口赤红  阅读(189)  评论(2编辑  收藏  举报