鱼C论坛

 找回密码
 立即注册
查看: 2749|回复: 12

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

[复制链接]
发表于 2011-9-29 22:49:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在子程序中,小甲雨老师写到:
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等。
。。。。
然而,在我们这里并没有看到。却使用了栈命令。。为什么可以使用?
百思不解。。


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-9-30 13:55:45 | 显示全部楼层
应该是疏忽了,不定义是不可能的,即便是在同一个段内也要有定义的

点评

可以的!我测试过!  发表于 2014-1-19 21:20
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-10-1 13:59:08 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-1 14:20:39 | 显示全部楼层
在实模式下只怕不行,保护模式下也许有特例

点评

Debug模拟实模式!  发表于 2014-1-19 21:19
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-1 17:52:37 | 显示全部楼层
这样不定义使用栈应该是很危险的,在实模式下可能会导致系统崩溃,在保护模式下会导致应用程序崩溃。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 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
在后面有几个指令都会涉及到栈,
你每次都定义一个空栈的话,你写一个程序难道可以预算好,定义多大栈空间?
在后面的都是直接使用,
不需要定义空栈!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-4 13:18:24 | 显示全部楼层
进来学习学习 貌似老头子说的有道理
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-10-5 21:59:30 | 显示全部楼层
7#楼上说的,不定义栈,直接可以使用。我想应该可以。在很多汇编程序中,都没有看到定义栈。却使用PUSH,POP等命令。只是书上没有说明。用起来很担心出现问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2014-1-19 16:07:16 | 显示全部楼层
学习学习再学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-1-19 16:21:06 | 显示全部楼层
估计和操作系统有关吧 实模式估计不行 你看看SS:SP指向哪啊

点评

那里都可以,包括 SS=0 Sp=0 都可以正常使用! 【探究】当SS和SP的值都为0时入栈然后弹出 为什么值没有变化--请看我的分析! http://bbs.fishc.com/thread-42988-1-1.html  发表于 2014-1-19 21:17
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-1-19 21:14:19 | 显示全部楼层
DOS下的程序默认是
AX=0
BX=0
CX=0
DX=0
SP=FFEE
......................
打开debug什么都别干 执行R命令就行了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-1-19 21:17:00 | 显示全部楼层
谁说非要定义一个栈?栈只是一种数据访问的方式而已!把他指向任意地方都行了。
甚至 把SS设置为0,SP设置为0 栈依然可以使用:
【探究】当SS和SP的值都为0时入栈然后弹出 为什么值没有变化--请看我的分析!
http://bbs.fishc.com/thread-42988-1-1.html
所以不要太纠结栈地址的指向,默认即可!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-1-19 21:19:10 | 显示全部楼层
yuweiping 发表于 2011-10-5 21:59
7#楼上说的,不定义栈,直接可以使用。我想应该可以。在很多汇编程序中,都没有看到定义栈。却使用PUSH,POP ...

是可以的!只要不指向程序代码段!
【探究】当SS和SP的值都为0时入栈然后弹出 为什么值没有变化--请看我的分析!
http://bbs.fishc.com/thread-42988-1-1.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-28 11:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表