首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我们编写PUSH命令时,堆栈和sp会发生什么情况?(组件)

当我们编写PUSH命令时,堆栈和sp会发生什么情况?(组件)
EN

Stack Overflow用户
提问于 2013-07-12 18:25:25
回答 3查看 387关注 0票数 0

我刚开始学习汇编,我和我的朋友对下面的命令有了不同的想法:

推送1234h

我们的问题是:第一个数字(12)将在堆栈中的哪个位置?

学生:sp-2?

学生:sp-4?

*sp =堆栈指针

EN

回答 3

Stack Overflow用户

发布于 2013-07-12 21:27:06

假设您讨论的是x86硬件(因为您指定了ss寄存器),字节将从最高位(最高有效位)推到最低位(最低有效位)。在本例中,它将先推送字节12h,然后再推送字节34h。由于在推送项目时x86堆栈指针会减少,因此内存布局将如下所示:

代码语言:javascript
复制
[sp+1] = 12h
[sp]   = 34h

如果以单词(两个字节)的形式访问sp,您将获得原始值:

代码语言:javascript
复制
[sp] = 1234h
票数 2
EN

Stack Overflow用户

发布于 2013-07-12 18:34:02

信不信由你,但你们两个都可能是对的。字节排序取决于机器的endianness

票数 1
EN

Stack Overflow用户

发布于 2013-07-18 14:59:40

在实模式下(看起来你正在尝试为它编写程序),地址首先被计算出来。公式很简单:

代码语言:javascript
复制
address = (segment<<4)+offset

然后,这个地址减去您试图推送的元素的大小(word:2字节,dword:4字节,qword:8字节)。第三步是在结果位置上写入数据。因此,如果SS0x30SP 0xFF,则:

  1. address = (0x30<<4)+0xFF = 0x3FF
  2. Element是word,所以我们在结果位置上减去position = 0x3FF - 2 = 0x3FD
  3. Writing:*((unsigned char*)position+1) = HIBYTE(0x1234).

数据(作为C指针):2*(unsigned char*)position = LOBYTE(0x1234)

所以,byte SS:[SP] = 0x34byte SS:[SP+1] = 0x12。请注意,堆栈向下增长/扩展,因此不会出现SP-x,而是SP+x

在保护模式下,事情要复杂一些(我在这里只写使用段寄存器的过程):

首先,处理器get的全局描述符表描述符的地址(由instruction).

  • Processor加载)将段寄存器的值与
  1. 的大小进行比较(如果大于,则抛出异常)。它还检查段寄存器是否没有指向空描述符(SS!=0)
  2. Then处理器获取指向GDT条目的指针,并计算从GDT开始的偏移量(使用SS*8).
  3. Processor必须检查以下内容:

4.1。网段是否存在? 4.2。我们是否有足够的权限访问细分市场? 4.3。是代码段吗? 4.4。它可写吗? 4.5。是ESP*granularity+base < limit 4.6。Is it system segment?

  • Then it通过base_of_segment+ESP.

  • After it计算地址,它继续类似于实数模式。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17612798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档