f393 发表于 2017-7-10 19:29:52

忽然发现汇编的实验三的一个问题……

汇编实验三中,指令如下
assume cs:codesg

codesg segment

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

        mov ax,4c00H
        int 21H

codesg ends
end
但是……为什么会先pop(出栈)后再push(入栈)?这样不是会溢出吗?

f393 发表于 2017-7-10 19:30:43

???{:5_94:}

云野 发表于 2017-7-10 20:04:47

那个啥、不是已经先给sp加4了咩?

f393 发表于 2017-7-10 20:27:52

怪不得,我还一直纳闷,为什么加4呢…没注意到…(<--小白)

f393 发表于 2017-7-10 20:29:59

云野 发表于 2017-7-10 20:04
那个啥、不是已经先给sp加4了咩?

不过还是会溢出……

云野 发表于 2017-7-11 00:57:52

再次看了一下、这个程序是感觉怪怪的、但是不能叫做溢出
通常来讲堆栈是由高地址向低地址生长的、而开始sp置0后加4、加4的过程就相当于pop出两个数据
楼主的问题应该是在开始就已经pop了跨越出栈的范围了是不是?所以你觉得这是溢出
但关于溢出的定义是这样的:堆栈溢出就是不顾堆栈中分配的局部数据块大小、向该数据块写入了过多的数据,导致数据越界,结果覆盖了老的堆栈数据。而弹出只是sp不指向它了数据还在、所以我说叫溢出不准确
另外、在理解这个问题上又引申出一个问题:当sp=0时、到底是栈空还是栈满?
楼主先想想、再来讨论呀、{:10_254:}

f393 发表于 2017-7-11 10:59:10

云野 发表于 2017-7-11 00:57
再次看了一下、这个程序是感觉怪怪的、但是不能叫做溢出
通常来讲堆栈是由高地址向低地址生长的、而开始sp ...

有道理

云野 发表于 2017-7-11 11:16:49

回答一下昨晚延伸的问题、
所以可以说明当sp为0的时候既可以是栈空也可以是栈满、
关键还是要看下一步怎么操作、
这样问题的关键已经出来、你可以把题中看作是栈满时、所以pop出数据也就不足为奇了

f393 发表于 2017-7-12 10:07:22

点赞,学到了
页: [1]
查看完整版本: 忽然发现汇编的实验三的一个问题……