微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

存储到堆栈地址的双字会影响地址+0..3 或地址-0..3 处的字节吗?

如何解决存储到堆栈地址的双字会影响地址+0..3 或地址-0..3 处的字节吗?

  • 在 x86 架构(比如 32 位)中,地址是否只指向单个字节?意思是,如果我们查看地址 0x0000 0000 0000 FFFF 那只是一个字节吗?我认为答案是肯定的,但需要确认

  • 我想知道如何存储此指令 movl %eax,-4(%rbp) 的值。我的理解是我们将值放在堆栈中基指针的较低地址处。

    既然 eax 是 32 位的,那么当我们进行操作时,它实际上是如何显示在堆栈上的?意思是,如果 eax 有 0x0a0b0c0d,并且使用小端是这个吗?

rbp[-4]   0d           ; low byte at given address
rbp[-3]   0c
rbp[-2]   0b
rbp[-1]   0a           ; dword ending here

还是这个?

rbp[-7]   0d
rbp[-6]   0c
rbp[-5]   0b
rbp[-4]   0a          ; high byte at given address,dword ending here

或 还有什么是因为我不明白?任何帮助都会很棒

解决方法

每个字节都有自己的地址,因此从这个意义上说,地址 0x12345678 只有一个字节。但是,我们通常会说“地址 0x12345678 处的双字”之类的东西。这意味着由地址 0x12345678、0x12345679、0x1234567a、0x1234567b 处的字节组成的 4 字节双字,最低有效在前。

所以这取决于您所说的“查看地址”是什么意思。例如,如果您要求调试器显示地址 0x12345678 的内容,并且设置为显示双字,它将显示一个 4 字节的双字,但这并不意味着该双字的所有 4 个字节都位于地址 0x12345678 .

因此,您对 movl %eax,-4(%rbp) 的两次猜测中的第一个是正确的。对于大于 1 个字节的加载和存储,给定的地址指向要访问的对象的最低地址字节。

请注意,这使得对齐计算工作良好:对齐的双字是地址为 4 的倍数的双字,因此双字地址的低 2 位为零。在 C 术语中 ((uintptr_t)&intvar) % 4 == 0,对于 alignof(int) == 4。另一种方式意味着低 n 位对于对齐的对象必须全为 1。

,

是和否。寻址粒度是一个字节,所以是的,地址0x0000 0000 0000 FFFF指向一个字节,其前驱用0x0000 0000 0000 FFFE寻址,后继用0x0000 0000 0001 0000寻址。然而,我们也可以从同一地址加载一个 16 位字,而不是一个字节。 例如,指令MOV AX,[0x0000_0000_0000_FFFF]将从0x0000 0000 0000 FFFF加载AL和从0x0000 0000 0001 0000加载AH。在这种情况下,0x0000 0000 0000 FFFF 指的是一个词。类似地,更长的数据类型可以用相同的数字寻址(尽管在此架构中始终建议对齐,有时甚至是强制性的)。

如果 EAX 包含值 0x0a0b0c0d,则 AL=0x0DAH=0x0C 等。 movl %eax,-4(%rbp) 别名 MOV [RBP-4],EAX 在 Intel 语法中,将 32 位双字存储到地址 [RBP-4],即 AL=0x0D 转到 [RBP-4]AH=0x0C 转到[RBP-3]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。