大家在看王爽老师的《汇编语言》(第二版)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中的内容,为什么会没有修改呢?)
还请高手指点一下。谢谢!
分 -->
|