assembly language 实验1 用机器指令和汇编指令编程

实验任务1

(1)使用Debug,将下面的程序段写入内存,逐条执行,观察每条指令执行后CPU中相关寄存器中内容的变化。

机器码 汇编指令
b8 20 4e mov ax,4E20H
05 16 14 add ax,1416H
bb 00 20 mov bx,2000H
01 d8 add ax,bx

实验结果;

1.利用E命令向1000:0开始的内存单元写入11个字节的机器码,并利用D命令和U命令查看写入结果。

2.利用R命令修改CS、IP中的内容,使其指向1000:0

3.利用T命令逐步执行,观察结果

4.利用A命令将指令写入内存并利用T命令执行

(2)将下面三条指令写入从2000:0开始的内存单元,利用这3条指令计算2的8次方。

汇编指令
mov ax,1
add ax,ax
jmp 2000:0003

(3)查看内存中的内容。

PC机主板上的ROM中写有一个生产日期,在内存FFF00H~FFFFFH的某几个单元中,请找到这个生产日期并试图改变它。

实验结果:DoseBox中的虚拟主板上的生产日期未92年1月1日,同时该地址无法改变。由于地址C0000~FFFFF中的内存单元为只读存储器的地址空间,所以写入数据时无效的,因为这相当于改变只读存储器中的内容。

(4)向内存从B8100H开始的单元中填写数据,如

​ -e B810:0000 01 01 02 02 03 03 04 04

先填写不同的数据,观察产生的现象;再改变填写地址,观察产生的现象。

1.向B810:0填写不同的数据

2.向不同的地址写入数据

实验结果:观察实验结果,发现向B810:0写入数据会使得显示器上出现色块,不同的数据所显示的色块不一样,向不同内存单元写入数据显示的色块位置不同。

这是因为向地址A0000~BFFFF的内存单元中写入数据就是向显存中写入数据,这些数据会被显卡输出到显示器上。

实验任务2

(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:00FF,内容是a4a2

push bx ;sp = 00FC;修改的内存单元地址是2200:00FE,内容是acaa

pop ax ;sp = 00FE; ax = a4a2

pop bx ;sp = 0100; bx = acaa

push [4] ;sp = 00FE;修改的内存单元地址是2200:00FF,内容是5554

push [6] ;sp = 00FC;修改的内存单元地址是2200:00FF,内容是5756

根据实际运行结果得到的答案为:

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:00FF,内容是a4a2

push bx ;sp = 00FC;修改的内存单元地址是2200:00FE,内容是acaa

pop ax ;sp = 00FE; ax = acaa

pop bx ;sp = 0100; bx = a4a2

push [4] ;sp = 00FE;修改的内存单元地址是2200:00FF,内容是5554

push [6] ;sp = 00FC;修改的内存单元地址是2200:00FF,内容是5756

与理论分析比较,发现执行"pop ax" 和"pop bx"处理论分析的结果错误。这是因为分析的时候忽略了栈具有先进后出,后进先出的特性,从而导致获得的答案错误。

(2)观察图3.19实验过程,然后分析:为什么2000:0~2000:f中的内容回发生改变?

分析:初始三行指令解释如下:

mov ax,2000 代表将2000赋值给 ax

mov ss,ax 代表将ax的内容赋值给栈顶段地址寄存器ss

mov sp,10 代表将10赋值给栈顶偏移地址寄存器sp

通过观察单步调试的结果,发现当"mov ss,ax"指令执行之后,紧接着不需要T命令"mov xp,10"指令会立即执行,这就代表这此时栈顶为2000:10,栈底也为2000:10,表示创建了一个栈。

同时发现当"mov sp,10"指令完成之后,2000:0~2000:f 单元值立刻发生变化,经过比较之后发现靠近栈顶存储的内容与CS、IP存储内容一致。根据数据进栈之后观察靠近栈顶内存单元存储内容,基本确定靠近栈存储的内容为CS、IP的值。

通过查阅资料之后发现,这是DEBUG调用T指令调试时会产生中断,为保存现场依次把标志寄存器、SS、CS、IP中的内容保存在栈中靠近栈顶的位置,跟创建栈本身没有关系。

实验总结

1.本次实验主要学习到的内容是Debug中的各种指令:

  • R命令,查看修改CPU寄存器中的内容

  • D命令,查看内存中的内容

  • E命令,修改内存中的内容(可以写入数据和指令)

  • U命令,将内存中的内容解释为机器指令和对应的汇编指令

  • T命令,执行执行CS:IP指向的内存单元处的指令

  • A命令,以汇编指令的形式向内存中中写入指令
    2.D命令的格式为“d 段地址:偏移地址”,由于段地址存放在段地址寄存器中,所以在使用D命令的时候可以将段地址替换为段地址寄存器。同理,在E、A、U命令中,同样可以使用段地址寄存器。

3.在执行与SS有关的指令之后,下一条和SP有关的指令会被立刻执行。(这是mov ss,**这类指令的特点)。这是为了便于控制栈段大小,防止特别是在有子程序调用时出错。这两条指令执行后,靠近栈顶的内存单元会发生改变,这是DEBUG调用T指令调试时会产生中断,为保存现场依次把标志寄存器、SS、CS、IP中的内容保存在栈中靠近栈顶的位置,跟创建栈本身没有关系。
中断机制的过程:

  • 1)(从中断信息中)找到中断字节码

  • 2)标志寄存器的值入堆栈

  • 3)设置标志寄存器的第8位TF和第9位IF值为0

  • 4)CS 值入栈

  • 5)IP值入栈

  • 6)从内存地址为 终端类型码4 和 中断类型码4+2的两个字单元读取中断处理程序的入口地址,设置CS IP

posted @ 2020-10-09 21:21  qylh  阅读(199)  评论(2编辑  收藏  举报