汇编语言 王爽(第三版) 实验3 编程、编译、连接、跟踪

时间:2021-03-04 01:26:02

已做好的准备

  1. t1.asm文件已保存到C盘根目录下

  2. masm 5.0 需要自己从网上下载,然后安装,已保存到C盘根目录下

执行过程中问题的出现与解决

  1. 进入DOS方式,显示C:\DOCUME~1\ADMINI~1>,此时如何进入C盘根目录?在后面输入cd..,会显示C:\DOCUME~1,即此时已回退到Documents文件夹,再次输入cd..,会显示C:\>,即此时到达C盘根目录,输入cd masm,显示C:\MASM>,即进入C盘根目录下的MASM文件夹;

  2. 编译过程,Source filename [.ASM]输入t1,按下几个ENTER,出现Unable to open input file: t1.ASM,问题在哪?仔细看了书,发现只有当asm文件在MASM文件夹下,才可以仅输入文件名,更改输入c:\t1.asm,编译成功;

  3. Debug中-d ds:10 18是指查看1000:10~1000:18的内容

  4. 此实验源程序中的程序部分:

    mov ax,2000H
    mov ss,ax
    mov sp,0
    add sp,10
    pop ax
    pop bx
    push ax
    push bx
    pop ax
    pop bx

    mov ax,4c00H
    int 21H

根据我对程序的理解,程序的前四行是将2000H:0~2000H:9设置为栈,此时栈顶SS:SP指向2000AH,此时栈为空。第一个指令,pop ax,是弹出一个栈元素,从数据结构的学习中考虑,这样会导致错误,然而实际上并没有问题。

(摘自网络)

栈空间里没有内容,此时能弹堆栈?

首先说什么是栈空间,栈空间无非是一段由SS:SP指示的内存空间而已,一般情况下我们能够用栈操作指令访问它,当然,我们也可以用访问内存地址的任何一种合理方式访问这段空间。其次,我们说 栈空 表明的意思是:栈顶设置之初,我们没有栈操作的时候,这段空间的数据我们是未知的,所以通常也是没有用的,但是并不代表这时栈顶SS:SP所指向的内存字单元中没有数据!再有一点:无论是push还是pop操作,栈的操作在任何情况下都是有效的(但不一定在任何情况下都是合理的,对于不合理的栈操作正如问题 1 的回答中所讲,会有操作系统的干预。)