' push'之间的区别是什么?和' pushq'在at& t组装

时间:2018-01-14 16:44:48

标签: linux assembly gdb reverse-engineering att

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

我知道push会将一个值写入堆栈,我的假设是pushq做了类似的事情。 q在那里的事实使我认为应该有一个微妙的差异,但我似乎无法理解差异。

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

有问题的代码是:

pushq  $0x0
push   %r9

我知道$ 0x0对于NULL是十六进制的,而%r9是通用寄存器之一。这只是意味着Null我们写入堆栈,其上面写有寄存器%r9吗?

1 个答案:

答案 0 :(得分:6)

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

  • b =字节(8位)
  • s =短(16位整数)或单(32位浮点)
  • w =字(16位)
  • l = long(32位整数或64位浮点)
  • q = quad(64 bit)
  • t =十个字节(80位浮点)

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

pushq $0x0只将8个零字节推送到堆栈。然后push %r9定义%r9是64位寄存器并将其推送到堆栈。

关于堆栈增长的有趣事实,因此空字节将具有比%r9的值更高的地址,因此这可能是误解,因为%r9的实际值低于null字节。