鱼C论坛

 找回密码
 立即注册
查看: 923|回复: 6

[已解决]栈的起始点怎么设置?

[复制链接]
发表于 2023-5-20 20:55:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
书中关于栈,SS 是栈段,sp是栈底,那么,如果内存地址如果为2000:0~2000:70,,,那么我想要在2000:0030处设为栈开始的地方,2000:0040为栈结束的地方,怎么设置呢
最佳答案
2023-5-20 21:20:57
liuming1978 发表于 2023-5-20 21:08
如果,内存情况如下,2000:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
                         ...

在8086汇编语言中,栈是一种“后进先出”(LIFO)的数据结构,它从高地址向低地址增长。所以当你设置 SS(栈段寄存器)为2000H,SP(栈指针寄存器)为0030H,你其实是在声明:我的栈起始于物理地址2000:0030,并且将向下(即向低地址)增长。

因此,在你的情况中,如果你这么设置:
mov ss, 2000h
mov sp, 0030h

那么栈的开始处(也就是栈顶)实际上是在2000:0030,当你向栈中推入数据时,栈会向低地址增长,也就是说数据会填充到2000:0030之前的地址中,比如2000:002F, 2000:002E等等。因此,实际可用的栈空间是从2000:0030到2000:0000。

当然,需要注意的是,你需要确保你的栈不会溢出,也就是说,你不能向栈中推入超过其大小的数据。在这个例子中,你的栈大小是0x30(即48个字节),所以你需要确保推入栈中的数据总量不超过这个数值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-20 20:58:28 | 显示全部楼层
在8086汇编语言中,可以使用指令 MOV SP, 0030H 将栈底指针 SP 设置为2000:0030,即栈的起始点。同时,也可以使用指令 MOV SS, 2000H 将栈段寄存器 SS 设置为2000H,以指定栈所在的内存段。

需要注意的是,在设置栈的起始点和结束点时,应该确保栈的大小足够存储所需的数据,避免栈溢出。可以通过计算栈的大小来确定栈的结束点,例如,如果需要存储100个字节的数据,则栈的结束点应该为2000:0090。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-20 21:08:26 | 显示全部楼层
isdkz 发表于 2023-5-20 20:58
在8086汇编语言中,可以使用指令 MOV SP, 0030H 将栈底指针 SP 设置为2000:0030,即栈的起始点。同时,也可 ...

如果,内存情况如下,2000:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
                                2000:10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
                                2000:20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
                                2000:30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
mov ss,2000h
mov sp,0030h
如果这么做的话,栈的空间开始处不是应该是2000:00 然后结速的的地方是2000:30,,栈的大小不就应该是2000:00~~2000:30吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-20 21:09:08 | 显示全部楼层
在实模式下,SS:SP 寄存器对应栈底地址。为了将栈指针 SP 指向内存地址 2000:0030,你需要将 SS 寄存器设置为 2000,并将 SP 寄存器设置为偏移地址 0030。具体操作步骤如下:

将 SS 寄存器的值设为 2000。
将 SP 寄存器的值设为偏移地址 0030。
确认设置成功。可以通过将数据压入栈中并检查栈指针位置来确认栈指针的位置是否正确。
要设置栈的结束位置为 2000:0040,你可以将栈大小设置为 16 字节 (0x0040 - 0x0030 = 16),这样栈的结束位置就会在偏移地址 0040 处。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-20 21:20:57 | 显示全部楼层    本楼为最佳答案   
liuming1978 发表于 2023-5-20 21:08
如果,内存情况如下,2000:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
                         ...

在8086汇编语言中,栈是一种“后进先出”(LIFO)的数据结构,它从高地址向低地址增长。所以当你设置 SS(栈段寄存器)为2000H,SP(栈指针寄存器)为0030H,你其实是在声明:我的栈起始于物理地址2000:0030,并且将向下(即向低地址)增长。

因此,在你的情况中,如果你这么设置:
mov ss, 2000h
mov sp, 0030h

那么栈的开始处(也就是栈顶)实际上是在2000:0030,当你向栈中推入数据时,栈会向低地址增长,也就是说数据会填充到2000:0030之前的地址中,比如2000:002F, 2000:002E等等。因此,实际可用的栈空间是从2000:0030到2000:0000。

当然,需要注意的是,你需要确保你的栈不会溢出,也就是说,你不能向栈中推入超过其大小的数据。在这个例子中,你的栈大小是0x30(即48个字节),所以你需要确保推入栈中的数据总量不超过这个数值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-20 21:25:25 | 显示全部楼层
陶远航 发表于 2023-5-20 21:09
在实模式下,SS:SP 寄存器对应栈底地址。为了将栈指针 SP 指向内存地址 2000:0030,你需要将 SS 寄存器设置 ...

我可以这样理解吗,先把栈指针指向栈底,然后,规定这个指针可以移动的范围,如果我将指针初始化指向2000:0030这个位置,然后规定栈指针只能向上(push)移动16次,也就是移动到2000:10这个位置,这就是我所说的定义栈的起始点,我这么理解对吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-20 21:27:24 | 显示全部楼层
liuming1978 发表于 2023-5-20 21:25
我可以这样理解吗,先把栈指针指向栈底,然后,规定这个指针可以移动的范围,如果我将指针初始化指向2000 ...

你的理解有一定道理,起始点和结束点之间给定一个可以移动的范围可以定义栈的大小。通常情况下,栈向上生长(push),即栈指针向内存地址较大的方向移动。因此,如果将栈指针初始化为2000:0030,将栈大小设置为16字节,则栈的结束位置为2000:0040,栈指针最多只能移动16次,并且它不能超出栈的范围。这样就可以定义一个从2000:0030到2000:0040的栈。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-24 08:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表