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
的值低于空字节。
我最近开始寻求更深入地了解我的计算机的工作原理。我的问题是关于 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
的值低于空字节。