at&t 汇编中 'push' 和 'pushq' 有什么区别

What's the difference between 'push' and 'pushq' in at&t assembly

我最近开始寻求更深入地了解我的计算机的工作原理。我的问题是关于 push 和 pushq 之间的区别。

我知道 push 向堆栈写入一个值,我的假设是 pushq 做类似的事情。 q 在那里的事实让我觉得应该有细微的差别,但我似乎无法理解这种差别。

我说在使用 gdb 和命令 'layout asm' 调试文件 /lib/udev/iphone-set-info 时思考这个问题。

有问题的代码是:

pushq  [=12=]x0
push   %r9

我知道 $0x0 是 NULL 的十六进制,%r9 是通用寄存器之一。这是否仅仅意味着 Null us 写入堆栈,寄存器 %r9 写在它上面?

我不确定您使用的是哪种汇编语言,但对于也使用 AT&T 语法的 GAS(GNU 汇编程序)也是如此:GAS 汇编指令通常以字母 "b"、"s"、"w"、"l"、"q" 或 "t" 以确定正在操作的操作数的大小。

  • b = 字节(8 位)
  • s = short(16 位整数)或单个(32 位浮点数)
  • w = 字(16 位)
  • l = long(32位整数或64位浮点数)
  • q = 四边形(64 位)
  • t = 十个字节(80 位浮点数)

如果未指定后缀,并且指令没有内存操作数,GAS 会根据目标寄存器操作数(最终操作数)的大小推断操作数大小。

pushq [=10=]x0 只是将 8 个零字节压入堆栈。然后 push %r9 定义 %r9 是 64 位寄存器并将其值压入堆栈。

关于堆栈的有趣事实,它会向​​下增长,因此空字节的地址将高于 %r9 的值,所以这里可能是误解,因为实际上 %r9 的值低于空字节。