[英]What's the difference between 'push' and 'pushq' in at&t assembly
我最近开始寻求更好地理解我的计算机是如何工作的。 我的问题是关于push和pushq之间的区别。
我知道push会将一个值写入堆栈,我的假设是pushq做了类似的事情。 q在那里的事实让我觉得应该有一个微妙的区别,但我似乎无法理解差异。
我说在使用命令'layout asm'使用gdb调试文件/ lib / udev / iphone-set-info时考虑这个问题。
有问题的代码是:
pushq $0x0
push %r9
我知道$ 0x0对于NULL是十六进制的,而%r9是通用寄存器之一。 这只是意味着Null我们写入堆栈,其上面写有寄存器%r9吗?
我不确定你使用的是哪种汇编语言,但对于使用AT&T语法的GAS(GNU汇编程序)来说也是如此:GAS汇编指令通常以字母“b”,“s”,“w”,“ l“,”q“或”t“确定操作的操作数大小。
如果未指定后缀,并且指令没有存储器操作数,则GAS根据目标寄存器操作数(最终操作数)的大小推断操作数大小。
pushq $0x0
只是将8个零字节推送到堆栈。 然后push %r9
定义%r9
是64位寄存器并将其值推送到堆栈。
关于堆栈增长的有趣事实,因此空字节将具有比%r9
的值更高的地址,因此这可能是误解,因为%r9
实际值低于空字节。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.