栈的起始点怎么设置?
书中关于栈,SS 是栈段,sp是栈底,那么,如果内存地址如果为2000:0~2000:70,,,那么我想要在2000:0030处设为栈开始的地方,2000:0040为栈结束的地方,怎么设置呢在8086汇编语言中,可以使用指令 MOV SP, 0030H 将栈底指针 SP 设置为2000:0030,即栈的起始点。同时,也可以使用指令 MOV SS, 2000H 将栈段寄存器 SS 设置为2000H,以指定栈所在的内存段。
需要注意的是,在设置栈的起始点和结束点时,应该确保栈的大小足够存储所需的数据,避免栈溢出。可以通过计算栈的大小来确定栈的结束点,例如,如果需要存储100个字节的数据,则栈的结束点应该为2000:0090。 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吗 在实模式下,SS:SP 寄存器对应栈底地址。为了将栈指针 SP 指向内存地址 2000:0030,你需要将 SS 寄存器设置为 2000,并将 SP 寄存器设置为偏移地址 0030。具体操作步骤如下:
将 SS 寄存器的值设为 2000。
将 SP 寄存器的值设为偏移地址 0030。
确认设置成功。可以通过将数据压入栈中并检查栈指针位置来确认栈指针的位置是否正确。
要设置栈的结束位置为 2000:0040,你可以将栈大小设置为 16 字节 (0x0040 - 0x0030 = 16),这样栈的结束位置就会在偏移地址 0040 处。 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个字节),所以你需要确保推入栈中的数据总量不超过这个数值。 陶远航 发表于 2023-5-20 21:09
在实模式下,SS:SP 寄存器对应栈底地址。为了将栈指针 SP 指向内存地址 2000:0030,你需要将 SS 寄存器设置 ...
我可以这样理解吗,先把栈指针指向栈底,然后,规定这个指针可以移动的范围,如果我将指针初始化指向2000:0030这个位置,然后规定栈指针只能向上(push)移动16次,也就是移动到2000:10这个位置,这就是我所说的定义栈的起始点,我这么理解对吗
liuming1978 发表于 2023-5-20 21:25
我可以这样理解吗,先把栈指针指向栈底,然后,规定这个指针可以移动的范围,如果我将指针初始化指向2000 ...
你的理解有一定道理,起始点和结束点之间给定一个可以移动的范围可以定义栈的大小。通常情况下,栈向上生长(push),即栈指针向内存地址较大的方向移动。因此,如果将栈指针初始化为2000:0030,将栈大小设置为16字节,则栈的结束位置为2000:0040,栈指针最多只能移动16次,并且它不能超出栈的范围。这样就可以定义一个从2000:0030到2000:0040的栈。
页:
[1]