忽然发现汇编的实验三的一个问题……
汇编实验三中,指令如下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(入栈)?这样不是会溢出吗? ???{:5_94:} 那个啥、不是已经先给sp加4了咩? 怪不得,我还一直纳闷,为什么加4呢…没注意到…(<--小白) 云野 发表于 2017-7-10 20:04
那个啥、不是已经先给sp加4了咩?
不过还是会溢出……
再次看了一下、这个程序是感觉怪怪的、但是不能叫做溢出
通常来讲堆栈是由高地址向低地址生长的、而开始sp置0后加4、加4的过程就相当于pop出两个数据
楼主的问题应该是在开始就已经pop了跨越出栈的范围了是不是?所以你觉得这是溢出
但关于溢出的定义是这样的:堆栈溢出就是不顾堆栈中分配的局部数据块大小、向该数据块写入了过多的数据,导致数据越界,结果覆盖了老的堆栈数据。而弹出只是sp不指向它了数据还在、所以我说叫溢出不准确
另外、在理解这个问题上又引申出一个问题:当sp=0时、到底是栈空还是栈满?
楼主先想想、再来讨论呀、{:10_254:} 云野 发表于 2017-7-11 00:57
再次看了一下、这个程序是感觉怪怪的、但是不能叫做溢出
通常来讲堆栈是由高地址向低地址生长的、而开始sp ...
有道理 回答一下昨晚延伸的问题、
所以可以说明当sp为0的时候既可以是栈空也可以是栈满、
关键还是要看下一步怎么操作、
这样问题的关键已经出来、你可以把题中看作是栈满时、所以pop出数据也就不足为奇了 点赞,学到了
页:
[1]