
sp=buffer+stacksize
表明栈指针初始指向数组末尾,栈结构的生长方向应该是低地址,也就是说:
当sp指向数组buffer的首部时,有效数值已经将数组填满,此时栈满
当sp指向数组buffer的尾部时,恢复到初始状态,此时栈空
还有,*sp--=data这句,相当于:
*sp=data
--sp
表示栈的生长方向是低地址。
以上代码中存在逻辑错误,修改代码见私信。
题目给的是一.LST文件,先还原为PSTACK.ASMSTACKSG SEGMENT STACK
DW 32 DUP(?)
TOP LABEL WORD
STACKSG ENDS
CODESG SEGMENT
ASSUME CS:CODESG,SS:STACKSG
BEGIN PROC FAR
MOV AX,STACKSG
MOV SS,AX
MOV SP,OFFSET TOP
PUSH DS
XOR AX,AX
PUSH AX
CALL B10
RET
BEGIN ENDP
B10: PROC NEAR
CALL C10
RET
ENDP
C10: PROC NEAR
RET
ENDP
CODESG ENDS
END BEGIN
用MASM和LINK汇编链接得PSTACK.EXE
再运行CMD进到命令提示符下:
输入DEBUG PSTACK.EXE(回车),依次键入:
-d:0 显示如下:
13DC:0000 CD 20 FF 9F ... ...
先记下PSP段地址为13DCH再输入
-r 显示:
... ...
DS=13DC ES=13DC SS=13EC CS=13F0 IP=0 ...
再输入
-t=0
-t
...
输入n个t后,到IP=40时,SP=0038H,堆栈最满.
此时执行
-dss:0,显示:
... ...
13EC:0030 00 00 14 00 F0 13 F0 0D-13 00 0F 00 00 00 DC 13
由于每台电脑执行程序时,浮动地址不一,题目给定
PSP=1234H,与本机PSP段地址为13DCH相差后,依次填入下表:
位移 栈内容 [十六进制]
(0032) (0014) IP 入栈
(0034) (1248) CS 入栈
(0036) (0584)
(0038) (0013) IP 入栈
(003A) (000F)
(003C) (0000)push ax 时入栈的数据
(003E) (1234)push ds 时入栈的段址
SP=0038H
ss表示堆栈段段地址,sp表示堆栈栈顶偏移地址(通常称作:栈顶指针)。进栈 *** 作时,先把栈顶指针减2,然后把 *** 作数(一个字,双字节)存放到这个地址,低位字节在前,高位字节在后;出栈 *** 作时,先把栈顶指针指向的双字节数据赋给指定的寄存器,然后把栈顶指针加2。所以,指令push bx执行后,ss:[00ffh]=58h, ss:[00feh]=6ah,sp=0feh,“”是汇编语言的注释标志符号;
指令pop ax执行后,ax=586ah,sp=100h。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)