我刚开始学习汇编,我和我的朋友对下面的命令有了不同的想法:
推送1234h
我们的问题是:第一个数字(12)将在堆栈中的哪个位置?
学生:sp-2?
学生:sp-4?
*sp =堆栈指针
发布于 2013-07-12 21:27:06
假设您讨论的是x86硬件(因为您指定了ss寄存器),字节将从最高位(最高有效位)推到最低位(最低有效位)。在本例中,它将先推送字节12h,然后再推送字节34h。由于在推送项目时x86堆栈指针会减少,因此内存布局将如下所示:
[sp+1] = 12h
[sp] = 34h如果以单词(两个字节)的形式访问sp,您将获得原始值:
[sp] = 1234h发布于 2013-07-12 18:34:02
信不信由你,但你们两个都可能是对的。字节排序取决于机器的endianness。
发布于 2013-07-18 14:59:40
在实模式下(看起来你正在尝试为它编写程序),地址首先被计算出来。公式很简单:
address = (segment<<4)+offset然后,这个地址减去您试图推送的元素的大小(word:2字节,dword:4字节,qword:8字节)。第三步是在结果位置上写入数据。因此,如果SS为0x30和SP 0xFF,则:
address = (0x30<<4)+0xFF = 0x3FFposition = 0x3FF - 2 = 0x3FD*((unsigned char*)position+1) = HIBYTE(0x1234).数据(作为C指针):2,*(unsigned char*)position = LOBYTE(0x1234)
所以,byte SS:[SP] = 0x34和byte SS:[SP+1] = 0x12。请注意,堆栈向下增长/扩展,因此不会出现SP-x,而是SP+x。
在保护模式下,事情要复杂一些(我在这里只写使用段寄存器的过程):
首先,处理器get的全局描述符表描述符的地址(由instruction).
SS!=0)SS*8).4.1。网段是否存在? 4.2。我们是否有足够的权限访问细分市场? 4.3。是代码段吗? 4.4。它可写吗? 4.5。是ESP*granularity+base < limit 4.6。Is it system segment?
base_of_segment+ESP.
https://stackoverflow.com/questions/17612798
复制相似问题