yuweiping 发表于 2011-9-29 22:49:01

关于王爽的实验10的第一个子程序的栈的疑问。

在子程序中,小甲雨老师写到:
show_str:   ;显示字符串的子程序[定义开始]
      push cx
      push si
      mov al,0A0h
      dec dh          ;行号在显存中下标从0开始,所以减1
      mul dh
........

我的疑问是:
我们在程序里面并没有定义栈段。为什么,我就可以直接使用栈的命令了?在前面的课程中,我们都是定义了栈段,
例如:stack segment
            db 16 dup(0)
      stack ends
mov ax,stack
mov ss,ax
mov sp,16
....后面就可以使用PUSH,POP等。
。。。。
然而,在我们这里并没有看到。却使用了栈命令。。为什么可以使用?
百思不解。。


topcookie 发表于 2011-9-30 13:55:45

应该是疏忽了,不定义是不可能的,即便是在同一个段内也要有定义的

yuweiping 发表于 2011-10-1 13:59:08

topcookie 发表于 2011-9-30 13:55 static/image/common/back.gif
应该是疏忽了,不定义是不可能的,即便是在同一个段内也要有定义的

我试过了。没有定义栈,也可以。。。

topcookie 发表于 2011-10-1 14:20:39

在实模式下只怕不行,保护模式下也许有特例

cyousui 发表于 2011-10-1 17:52:37

这样不定义使用栈应该是很危险的,在实模式下可能会导致系统崩溃,在保护模式下会导致应用程序崩溃。

老头子学汇编 发表于 2011-10-4 12:24:12

本帖最后由 老头子学汇编 于 2011-10-4 12:34 编辑

当你定义一个db 16 dup (0)空栈的时候
栈空间只是0~16
sp指向17的时候你最多可以push 八次入栈
如果再push进去就会出现栈顶越界!
看看第3章 3.8 栈顶越界的问题

如果不定义一个空栈的时候
栈空间是0~FFFFH
在后面有几个指令都会涉及到栈,
你每次都定义一个空栈的话,你写一个程序难道可以预算好,定义多大栈空间?
在后面的都是直接使用,
不需要定义空栈!

苍白の月 发表于 2011-10-4 13:18:24

进来学习学习 貌似老头子说的有道理

yuweiping 发表于 2011-10-5 21:59:30

7#楼上说的,不定义栈,直接可以使用。我想应该可以。在很多汇编程序中,都没有看到定义栈。却使用PUSH,POP等命令。只是书上没有说明。用起来很担心出现问题。

菜鸟一个a 发表于 2014-1-19 16:07:16

学习学习再学习

sokou001 发表于 2014-1-19 16:21:06

估计和操作系统有关吧 实模式估计不行 你看看SS:SP指向哪啊

无名侠 发表于 2014-1-19 21:14:19

DOS下的程序默认是
AX=0
BX=0
CX=0
DX=0
SP=FFEE
......................
打开debug什么都别干 执行R命令就行了!

无名侠 发表于 2014-1-19 21:17:00

谁说非要定义一个栈?栈只是一种数据访问的方式而已!把他指向任意地方都行了。
甚至 把SS设置为0,SP设置为0 栈依然可以使用:
【探究】当SS和SP的值都为0时入栈然后弹出 为什么值没有变化--请看我的分析!
http://bbs.fishc.com/thread-42988-1-1.html
所以不要太纠结栈地址的指向,默认即可!

无名侠 发表于 2014-1-19 21:19:10

yuweiping 发表于 2011-10-5 21:59 static/image/common/back.gif
7#楼上说的,不定义栈,直接可以使用。我想应该可以。在很多汇编程序中,都没有看到定义栈。却使用PUSH,POP ...

是可以的!只要不指向程序代码段!
【探究】当SS和SP的值都为0时入栈然后弹出 为什么值没有变化--请看我的分析!
http://bbs.fishc.com/thread-42988-1-1.html
页: [1]
查看完整版本: 关于王爽的实验10的第一个子程序的栈的疑问。