记一次汇编语言实验

472 阅读3分钟

这是我参与更文挑战的第12天,活动详情查看:更文挑战

用debug,将下面的程序写入内存,逐条执行,根据指令执行后的实际运行情况填空 使用 a命令输入 7 行指令,使用 e 命令修改 2000:0·~2000:f 的值,及修改后查看的部分 单步执行调试,并且每步调试后都用d命令查看2000:0·~2000:f的值: 从中我们发现前三行的指令的功能为:把0·~2000:f这段空间当做栈段,初始化栈顶 mov sp,0010H :设置栈顶的偏移地址,栈为空,sp=0010H 栈顶为2000:0010,栈底为2000:000E

首先初始化2000:0位置的值

2000:0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 执行 mov AX,2000 2000:0 f的值不变 而在执行完mov ss,ax 同时也执了 mov sp,10后, 此时:d 2000:0 f 前变为,为 00 00 00 00 00 00 00 20-00 00 08 01 40 07 A4 01

——>可能说明:

当通过ax给ss初始化栈顶的时候,就已经把ax内存传送到了ss:sp-2的位置。

书之前讲过push、pop实质上是一种内存传送指令,说明他直接把ax的内存传送到栈的位置,

下面执行改变ax寄存器的值就是一个证明 而在执行完 mov ax,2123后,变为 00 00 00 00 00 00 23 31-00 00 0B 01 40 07 A4 01 可以发现,后面七八位的值随着AX的改变而改变

问题出在此时还没执行push AX 执行完push AX ,SP-2, 00 00 00 00 23 31 00 00-0C 01 40 07 A4 01 23 31 此时ax的值向前移动,说明SS:SP 一直指向栈顶。

执行 MOV AX,3366 00 00 00 00 66 33 00 00-0F 01 40 07 A4 01 23 31 而当改变AX的值时,栈中的值随之改变,可以再次说明栈只是内存传送。

执行push AX 00 00 66 33 00 00 10 01-40 07 A4 01 66 33 23 31 随着SP-2再次向前。问题出在,之前传入的AX的值就不见了,这个时候不禁好奇,为什么不见了?什么改变了。

栈一直向前移动(sp=sp-2)任何时候,SS:SP都指向栈顶,一直指向新加入的元素,8086只负责记录栈顶。

思考:

其实再没有动手之前,完全觉得汇编语言根本不可能学会,对寄存器直接操作如何才能转化为程序运行呢?但在实际动手之后,其实会发现汇编语言和C语言之间的很多相同点。