为什么没有定义栈,却可以直接使用栈呢?

[复制链接]
查看11 | 回复6 | 2021-1-27 06:35:02 | 显示全部楼层 |阅读模式
大家在看王爽老师的《汇编语言》(第二版)10.12的时候有没有发现,程序中并没有定义栈,结果却可以进行栈操作。见下面的程序:
assumecs:code
datasegment
db'conversationmin',0
dataends
codesegment
start:
movax,data
movds,ax
movsi,0
callcapital
movax,4c00h
int21h
capital:
pushcx
pushsi
change:
movcl,[si]
movch,0
jcxzok
andbyteptr[si],11011111b
incsi
jmpshortchange
ok:popsi
popcx
ret
codeends
endstart
运行结果如下:
C:\>debug21.exe
-r
AX=0000BX=0000CX=0031DX=0000SP=0000BP=0000SI=0000DI=0000
DS=0BA7ES=0BA7SS=0BB7CS=0BB8IP=0000NVUPEIPLNZNAPONC
0BB8:0000B8B70BMOVAX,0BB7
-u
0BB8:0000B8B70BMOVAX,0BB7
0BB8:00038ED8MOVDS,AX
0BB8:0005BE0000MOVSI,0000
0BB8:0008E80500CALL0010
0BB8:000BB8004CMOVAX,4C00
0BB8:000ECD21INT21
0BB8:001051PUSHCX
0BB8:001156PUSHSI
0BB8:00128A0CMOVCL,[SI]
0BB8:0014B500MOVCH,00
0BB8:0016E306JCXZ001E
0BB8:00188024DFANDBYTEPTR[SI],DF
0BB8:001B46INCSI
0BB8:001CEBF4JMP0012
0BB8:001E5EPOPSI
0BB8:001F59POPCX
-d0bb7:0f
0BB7:0000636F6E7665727361-74696F6E6D696E00conversationmin.
-g000e
AX=4C00BX=0000CX=0031DX=0000SP=0000BP=0000SI=0000DI=0000
DS=0BB7ES=0BA7SS=0BB7CS=0BB8IP=000ENVUPEIPLNZNAPENC
0BB8:000ECD21INT21
-p
Programterminatednormally
-d0bb7:0f
0BB7:0000434F4E5645525341-54494F4E4D494E00CONVERSATIONMIN.
-
问题在于,我在程序中并未定义栈啊,为什么可以直接进行栈操作呢?谁能解释一下呢?显然,栈段和数据段共用同一段内存空间,紧接着就是cs段。难道进行栈操作的时候不会修改data中的内容吗?(我故意定义了数据段长度正好为16字节,结果说明栈操作没有修改data中的内容,为什么会没有修改呢?)
还请高手指点一下。谢谢!
分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:35:02 | 显示全部楼层
操作系统会自动安排一段堆栈空间给程序来用,但是这样做不是很安全的,为了安全起见还是设置定义一下堆栈段。
回复

使用道具 举报

千问 | 2021-1-27 06:35:02 | 显示全部楼层
好像“。com”要自己指定栈,“。exe”不必
回复

使用道具 举报

千问 | 2021-1-27 06:35:02 | 显示全部楼层
堆栈是在内存上的空间,本来就有
回复

使用道具 举报

千问 | 2021-1-27 06:35:02 | 显示全部楼层
引用2楼schlafenhamster的回复:好像“。com”要自己指定栈,“。exe”不必
.com程序只须指定代码段起始地址就可以啦,栈段不需要指定吧,他的位置是固定的
回复

使用道具 举报

千问 | 2021-1-27 06:35:02 | 显示全部楼层
谢谢各位,后来经本人debug,解决了问题,现在说说本人的看法吧:发现初始的时候ss和cs指向同一段,系统默认栈段长度为64KB,这个可以从debug的时候sp的变化来推断。只不过,这时候栈是从内存最高处向地处增长,而程序代码则是从最地处向高处增长。因此,程序代码不可太长,否则会和栈中内容冲突。
|_____|ds,ss
|_____||
|_____||向下增长
|_____|v
|_____|
|_____|
|_____|
|_____|
|_____|
|_____|
|_____|
|_____|^
|_____||向上增长
|_____||
|_____|引用8楼bsnhk的回复:不定义栈时,栈会自动创建在代码段的最后的段界开始处,以16字节为单位进行分配。如果栈生长过度,会有覆盖后面其他代码或数据的危险。
你好,你是在哪看到的?我感觉貌似很有道理,是哪本书上面说的吗?
回复

使用道具 举报

千问 | 2021-1-27 06:35:02 | 显示全部楼层
学习顶学习学习
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行