关于堆栈的3个问题?

关于堆栈的3个问题?,第1张

首先注意构造函数stack(int size)中

sp=buffer+stacksize

表明栈指针初始指向数组末尾,栈结构的生长方向应该是低地址,也就是说:

当sp指向数组buffer的首部时,有效数值已经将数组填满,此时栈满

当sp指向数组buffer的尾部时,恢复到初始状态,此时栈空

还有,*sp--=data这句,相当于:

*sp=data

--sp

表示栈的生长方向是低地址。

以上代码中存在逻辑错误,修改代码见私信。

题目给的是一.LST文件,先还原为PSTACK.ASM

STACKSG 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。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11484388.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-16
下一篇2023-05-16

发表评论

登录后才能评论

评论列表(0条)

    保存