assembly - `and esp,0xfffffff0`是什么?

标签 assembly gdb disassembly

当我在 gdb 中反汇编 main() 时,它会重新调整此结果:

 0x0804854c <+0>:   push   ebp
   0x0804854d <+1>: mov    ebp,esp
   0x0804854f <+3>: and    esp,0xfffffff0
   0x08048552 <+6>: sub    esp,0x10

在代码中我检查esp注册如下:

x/32xw $esp

它使得:

0xbffffb70: 0xb7ea1515  0xb7ff0590  0x080485eb  0xb7fd2ff4
0xbffffb80: 0x080485e0  0x00000000  0xbffffc08  0xb7e88e46
0xbffffb90: 0x00000002  0xbffffc34  0xbffffc40  0xb7fe0860
0xbffffba0: 0xb7ff6821  0xffffffff  0xb7ffeff4  0x080482bc
0xbffffbb0: 0x00000001  0xbffffbf0  0xb7fefc16  0xb7fffac0
0xbffffbc0: 0xb7fe0b58  0xb7fd2ff4  0x00000000  0x00000000
0xbffffbd0: 0xbffffc08  0xd51689cb  0xfbfdbfdb  0x00000000
0xbffffbe0: 0x00000000  0x00000000  0x00000002  0x08048400

我想知道和 esp,0xfffffff0 和这些结果之间有什么关系。

最佳答案

和 esp,0xfffffff0 强制执行 16 字节堆栈对齐,这是常见的 ABI 要求。它通过屏蔽(设置为零)堆栈指针的最低有效 4 位来实现此目的,这相当于向下舍入到最接近的 16 倍数。

关于assembly - `and esp,0xfffffff0`是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28472455/

相关文章:

gdb - 如何用 GDB 分解内存范围?

c - 如何在反汇编中查看局部变量符号名称? (来自 C 源)

android - 在 Android.mk 中为程序集 (.s) 源文件定义一个符号?

assembly - Visual Studio C++ 的函数序言

assembly - 尝试在汇编程序中打印变量时 GDB 显示错误消息

c - 为什么 gdb 不能在没有二进制文件的情况下显示非符号堆栈跟踪?

c++ - 获取类成员变量的大小(无需运行代码)

assembly - 如何将shellcode分解为汇编指令? [复制]

c - 如何打印出通过 GNU 汇编程序中的 .size 指令分配的符号

assembly - 如何使用 Gas ('as' ) 在 64 位 linux 上组装 32 位二进制文​​件?