汇编实验2 用机器指和汇编指令编程

实验任务

(1)

用e命令修改0021:0~0021:f的值

debug 中输入如下指令:

用t命令单步执行

可得如下结果:

mov ax, 0021
mov ds, ax

mov ax, 2200
mov ss, ax

mov sp ,0100
mov ax,[0]                ;ax=_3130_
add ax, [2]               ;ax=_6462_
mov bx, [4]               ;bx=_3534_
add bx, [6]               ;bx=_6C6A_

push ax                   ;sp=_00FE_;修改的内存单元的地址是_2200:0100_内容为_6462_
push bx                   ;sp=_00FC_;修改的内存单元的地址是_2200:00FE_内容为_6C6A_
pop ax                    ;sp=_00FE_;ax=_6C6A_
pop bx                    ;sp=_0010_;bx=_6462_

push [4]                  ;sp=_00FE_;修改的内存单元的地址是_2200:0100_内容为_3534_
push [6]                  ;sp=_00FC_;修改的内存单元的地址是_2200:00FE_内容为_3736_

显然,命令

push ax
push bx
pop ax
pop bx

交换了寄存器ax和bx中的值

(2)输入如下指令并修改2000:0~2000:f中的值:

用t命令执行命令并用d命令查看内存的值:

 

分析为何改短内存中的值会发生改变:

首先,下三条指令:

mov ax,2000
mov ss,ax
mov sp,10

设置栈顶的地址为:2000:0010H;栈底为:2000:000FH

(但8086CPU并不能记录栈的大小)

然后,再来看看内存中的值到底是如何改变的:

第一次发生改变是在执行命令(mov ss, ax)后,新产生的数字有:2000,0108,073F,仔细一看,便容易发现,这些都是寄存器中的数值!

再继续执行:

0108又变为了010B,而这正是寄存器IP的值,便更能确定这些数值的改变与相应的寄存器有关

继续执行:

又惊讶的发现,该段内存中的数值整体前移了两位

再继续:

原本栈中的值竟然被ax寄存器中的值覆盖掉了。

对此,我只能猜想该段内存具有某种特殊性,更具体地说,是当此段地址在被作为栈时才与寄存器之间存在的某种联系。具体的规律是什么,因受知识限制,暂时还无法得出。。。。

总结与体会

1.这次实验让我实际操作了一下栈的使用,值得留意的一点是,在分配栈空间时,8086的CPU并没有寄存器能够记录栈的空间大小,稍不注意,就可能造成栈的越界问题,仔细想想,真的是一个很严重的问题,数据的覆盖很可能会导致整个系统的崩溃,这也是编写汇编是急需注意的问题

2.任何知识都有一个共性,那就是学的越深,不明白的东西越多,唯一办法就是:继续学下去,keep going!!!

posted @ 2018-11-01 11:24  鎖夢  阅读(195)  评论(1编辑  收藏  举报