汇编中的堆栈是什么?命令 .stack 是如何工作的?
What is a stack in assembly and how does the command .stack work?
我要直接跳进去:
我正在学习汇编并且正在使用涡轮汇编器。我真的刚刚开始学习,所以我试图让自己熟悉一些预定义的语言服务,并且正在阅读寄存器,以便我可以更好地理解为什么正在发生的事情正在发生。但是,在这种情况下,我似乎无法理解堆栈的实际含义。
我对栈的理解是,指令和数据的处理方式遵循后进先出法。那么命令.stack 100h 有什么作用呢?
我是否对可以加载到堆栈中的事物数量设置了限制?
那么这条线到底做了什么?:
.stack 100h
如果接受其他基数,.stack 100h 和.stack 256d 一样吗?会有任何技术或内部差异吗?
.stack
在 .exe
中设置元数据,影响 program-loader 为堆栈段分配的内存量。
实现此功能的一种方法是,在进入程序时,SS
基地址是最低可用堆栈地址,SP = 您给 .stack
的大小。如果 SP
更高,您可能会不小心使用超过 .stack
个字节而没有 SP 回绕,从而用其他东西创建 stack-clash。 (IDK 如果有一个标准需要 EXE program-loader 来为 SP 选择特定的偏移量。)
它不会在您的程序中创建任何额外的指令。它的参数只是一个数字常量;您可以根据您的汇编程序以您喜欢的任何数字为基础指定它。
.stack
对 .com
程序也没有影响:那些以 cs=ds=es=ss
和 SP=0fffeH
开头的程序(如果可用的连续内存少于 64kiB,则更低)。
(在.com
中,SP指向0
的return地址(在PSP中),其中有一个int 20h
指令会退出系统调用。所以在推送 0 之前,SP 开始于 0000h
)
这个答案是评论的总结,感谢@Jester、@rcgldr 和@MichaelPetch 确认它看起来很简单,并指出了 .exe 和 .com 程序之间的区别。
我要直接跳进去: 我正在学习汇编并且正在使用涡轮汇编器。我真的刚刚开始学习,所以我试图让自己熟悉一些预定义的语言服务,并且正在阅读寄存器,以便我可以更好地理解为什么正在发生的事情正在发生。但是,在这种情况下,我似乎无法理解堆栈的实际含义。
我对栈的理解是,指令和数据的处理方式遵循后进先出法。那么命令.stack 100h 有什么作用呢?
我是否对可以加载到堆栈中的事物数量设置了限制?
那么这条线到底做了什么?:
.stack 100h
如果接受其他基数,.stack 100h 和.stack 256d 一样吗?会有任何技术或内部差异吗?
.stack
在 .exe
中设置元数据,影响 program-loader 为堆栈段分配的内存量。
实现此功能的一种方法是,在进入程序时,SS
基地址是最低可用堆栈地址,SP = 您给 .stack
的大小。如果 SP
更高,您可能会不小心使用超过 .stack
个字节而没有 SP 回绕,从而用其他东西创建 stack-clash。 (IDK 如果有一个标准需要 EXE program-loader 来为 SP 选择特定的偏移量。)
它不会在您的程序中创建任何额外的指令。它的参数只是一个数字常量;您可以根据您的汇编程序以您喜欢的任何数字为基础指定它。
.stack
对 .com
程序也没有影响:那些以 cs=ds=es=ss
和 SP=0fffeH
开头的程序(如果可用的连续内存少于 64kiB,则更低)。
(在.com
中,SP指向0
的return地址(在PSP中),其中有一个int 20h
指令会退出系统调用。所以在推送 0 之前,SP 开始于 0000h
)
这个答案是评论的总结,感谢@Jester、@rcgldr 和@MichaelPetch 确认它看起来很简单,并指出了 .exe 和 .com 程序之间的区别。