当前位置: 代码迷 >> 汇编语言 >> 编译语言中一个栈的最小大小
  详细解决方案

编译语言中一个栈的最小大小

热度:9302   发布时间:2013-02-26 00:00:00.0
汇编语言中一个栈的最小大小
今天做了个汇编的题目,要求把数据段内的4个字符串从小写改成大写,用到了内外两个循环,进行行和每行字符串内每个字符的遍历更新,因此在内循环的时候要将cx的值压栈,代码如下:
assume cs:code,ds:data
data segment
db 'ibm '
db 'dec '
db 'dos '
db 'vax '
data ends

stack segment 
dw 0000H; 书上的例子中时给了栈8个字的大小
stack ends

code segment
start:
  mov ax,data
mov ds,ax
mov cx,0004H
mov bx,0000H
mov ax,stack
mov ss,ax
mov sp,0002H
S:
push cx 在第一次压栈的时候程序就终止了,并且SP也没有-2,变成0000H
mov cx,0003H
mov si,0000H
S1:
mov al, [bx+si]
and al, 11011111B
mov [bx+si], al
inc si
loop S1
add bx,0010H
pop cx
loop S

mov ax,4C00H
int 21H
code ends

end start

请问这是什么原因呢,是不是堆栈段对大小是有要求的?


------解决方案--------------------------------------------------------
sp的值为2
压栈一次之后sp当然是0了
如果用debug调试可能会出错,因为单步中断时会把flags,cs,ip压栈而你的栈空间太小,多次压栈可能会覆盖掉
有用的数据。
------解决方案--------------------------------------------------------
同意1L,看了你的程序,其实你有几个寄存器都没有使用,你可以使用这些寄存器来临时保存,这样效率会更好呢
------解决方案--------------------------------------------------------
sp的值为2
压栈一次之后sp当然是0了
如果用debug调试可能会出错,因为单步中断时会把flags,cs,ip压栈而你的栈空间太小,多次压栈可能会覆盖掉
有用的数据。

这个说法应该是正确的.DEBUG调试应该会出问题.
------解决方案--------------------------------------------------------
汇编中栈的大小是由程序员定义的,8086、8088实模式不超过64K

程序员即使不定义堆栈段,DOS初始化应用程序的时候也会自动初始化一个SS段,但是是不安全的

汇编不会自动检查堆栈段的溢出,包括上溢和下溢,需要程序员自编程检查
  相关解决方案