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

梁诚斌 2012-07-16 10:42:59
今天做了个汇编的题目,要求把数据段内的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

请问这是什么原因呢,是不是堆栈段对大小是有要求的?
...全文
436 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
梁诚斌 2012-07-21
  • 打赏
  • 举报
回复
图挂了,图上显示-t以后的SP值还是0002H
这个问题找到一个合理的解释了
http://zhidao.baidu.com/question/126188257.html
sgw888 2012-07-21
  • 打赏
  • 举报
回复
没下文了? 但是什么?
梁诚斌 2012-07-18
  • 打赏
  • 举报
回复
另外有个问题请教一下,就是我一旦设置了stack为堆栈段,即
MOV AX,STACK
MOV SS,AX
MOV SP,0002H
后,SS[SP - 2]就应该是0000H了,但是
梁诚斌 2012-07-18
  • 打赏
  • 举报
回复
另外,那个4个字符串是16个字节的,这个发上来后不知怎么变短了
梁诚斌 2012-07-18
  • 打赏
  • 举报
回复
assume cs:code,ds:data
data segment
db 'ibm '
db 'dec '
db 'dos '
db 'vax '
data ends

stack segment
dw 0000H
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
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

梁诚斌 2012-07-17
  • 打赏
  • 举报
回复
但实际使用中很有可能发生寄存器都已在使用,没有多余的寄存器可用的情况下,只能拿内存来存放循环计数的情况的,而且如果我把堆栈段开多点,就没有问题了,难道是堆栈段的大小不能为1.
WJN92 2012-07-17
  • 打赏
  • 举报
回复
同意1L,看了你的程序,其实你有几个寄存器都没有使用,你可以使用这些寄存器来临时保存,这样效率会更好呢
sgw888 2012-07-17
  • 打赏
  • 举报
回复
楼主是如何测试的? 如何跟踪的? 我用T一直跟踪到程序结束,用D DS:0 查看内存,程序正确执行了啊?都变成大写字母了啊. 用G命令直接执行到结束那儿,也没有问题啊.
sgw888 2012-07-17
  • 打赏
  • 举报
回复
原来是论坛的原因......无语.
引用
push cx 在第一次压栈的时候程序就终止了,并且SP也没有-2,变成0000H

我测试没有问题啊??
PUSH CX > SP=SP-2 之前的时候,SP=2H,SP-2不就是0吗?
sgw888 2012-07-17
  • 打赏
  • 举报
回复
引用
data segment
db 'ibm '
db 'dec '
db 'dos '
db 'vax '
data ends

问题出在这儿,请注意定义的字符串大小,应该是16个字节.而不是四个字节.
如下面定义就OK了
引用
data segment
db 'ibm '
db 'dec '
db 'dos '
db 'vax '
data ends
dlpzgr 2012-07-17
  • 打赏
  • 举报
回复
汇编中栈的大小是由程序员定义的,8086、8088实模式不超过64K

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

汇编不会自动检查堆栈段的溢出,包括上溢和下溢,需要程序员自编程检查
dlpzgr 2012-07-17
  • 打赏
  • 举报
回复
这个程序应该运行不正确

add bx,0003H
sgw888 2012-07-17
  • 打赏
  • 举报
回复
sp的值为2
压栈一次之后sp当然是0了
如果用debug调试可能会出错,因为单步中断时会把flags,cs,ip压栈而你的栈空间太小,多次压栈可能会覆盖掉
有用的数据。

这个说法应该是正确的.DEBUG调试应该会出问题.
order_c 2012-07-16
  • 打赏
  • 举报
回复
sp的值为2
压栈一次之后sp当然是0了
如果用debug调试可能会出错,因为单步中断时会把flags,cs,ip压栈而你的栈空间太小,多次压栈可能会覆盖掉
有用的数据。

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧