如何解决存储到堆栈地址的双字会影响地址+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=0x0D
、AH=0x0C
等。
movl %eax,-4(%rbp)
别名 MOV [RBP-4],EAX
在 Intel 语法中,将 32 位双字存储到地址 [RBP-4]
,即 AL=0x0D
转到 [RBP-4]
,AH=0x0C
转到[RBP-3]
等
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。