Rise877 2023-07-17 21:19 采纳率: 50%
浏览 15

求解关于汇编代码的困惑

佬们可否解释下movl $8,%esp和movl $8,(%esp)的区别,或者说我这么写根本不对T^T,应该是movl $0x8,%esp吗
那么pushl $8是相当于(32位)subl $4,%esp和movl $8,%esp吗,还是subl $4,%esp和movl $0x8,%esp,或subl $4,%esp和movl $0x8,(%esp)

  • 写回答

2条回答 默认 最新

  • 配电网和matlab 2023-07-17 22:49
    关注

    以下内容引用自GPT,有用望采纳:

    在汇编语言中,movl 指令用于将数据从一个位置拷贝到另一个位置。%esp 是一个特殊的寄存器,它被用作栈指针,指向系统堆栈的顶部。

    1. movl $8,%esp:这条指令将立即数8直接赋值给 %esp 寄存器,即将栈指针设置为8。换句话说,它将堆栈的顶部移动到地址8处。

    2. movl $8,(%esp):这条指令将立即数8存储到 %esp 寄存器所指向的内存地址中,即将地址 %esp 处的值设置为8。换句话说,它将8存储到堆栈的顶部位置。

    很多情况下,我们使用 pushl 指令将数据压入栈中。它的作用是将立即数或寄存器中的值压入堆栈顶部,并且会自动更新 %esp 寄存器指向新的栈顶位置。下面是 pushl 指令的等效操作:

    1. pushl $8:这条指令会将立即数8压入栈中。它等效于以下操作:
      • subl $4,%esp:分配一个4字节的栈内存空间,向下移动栈指针 %esp
      • movl $8,(%esp):将立即数8存储到栈顶,即将8存储到新的栈顶位置。

    综上所述,pushl $8 可以等价地表示为 subl $4,%espmovl $8,(%esp),它们都是分配4字节栈内存空间并将立即数8存储到栈顶的操作。对于栈操作,我们通常会使用 pushl 指令,因为它能够更方便地执行这两个步骤。

    评论

报告相同问题?

问题事件

  • 修改了问题 7月17日
  • 创建了问题 7月17日

悬赏问题

  • ¥60 Matlab联合CRUISE仿真编译dll文件报错
  • ¥15 脱敏项目合作,ner需求合作
  • ¥15 脱敏项目合作,ner需求合作
  • ¥30 Matlab打开默认名称带有/的光谱数据
  • ¥50 easyExcel模板 动态单元格合并列
  • ¥15 res.rows如何取值使用
  • ¥15 在odoo17开发环境中,怎么实现库存管理系统,或独立模块设计与AGV小车对接?开发方面应如何设计和开发?请详细解释MES或WMS在与AGV小车对接时需完成的设计和开发
  • ¥15 CSP算法实现EEG特征提取,哪一步错了?
  • ¥15 游戏盾如何溯源服务器真实ip?需要30个字。后面的字是凑数的
  • ¥15 vue3前端取消收藏的不会引用collectId