这是我参与更文挑战的第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语言之间的很多相同点。