加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux – at&t程序集中’push’和’pushq’之间的区别是什么

发布时间:2020-12-14 00:58:57 所属栏目:Linux 来源:网络整理
导读:我最近开始寻求更好地理解我的计算机是如何工作的.我的问题是关于push和pushq之间的区别. 我知道push会将一个值写入堆栈,我的假设是pushq做了类似的事情. q在那里的事实让我觉得应该有一个微妙的区别,但我似乎无法理解差异. 我说在使用命令’layout asm’使
我最近开始寻求更好地理解我的计算机是如何工作的.我的问题是关于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”确定操作的操作数大小.

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

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读