ATT汇编leave指令

2024-02-07 12:38
文章标签 指令 汇编 att leave

本文主要是介绍ATT汇编leave指令,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近在看c程序的编译出来的汇编文件,发现涉及到函数调用的地方,在返回时有的时候使用的leave,有的时候直接使用的是popl %ebp。
在AT&T汇编中,leave等效于以下汇编指令:
movl %ebp, %esp

popl %ebp

注意:此为32bits 操作系统,若为64bits 将使用rbp和rsp 寄存器!

为什么有的时候会使用leave,有的时候直接使用popl %ebp?这个问题一开始我也没搞懂,后来通过分析堆栈才有点清醒。
二者的差别就在于是否使用 movl %ebp, %esp。这句的作用是用来恢复堆栈的栈顶指针,是不是堆栈的栈顶指针没有变化的时候,
就可以不用恢复,直接使用popl指令了?这个疑惑经过验证被证实了。

main函数是一个最特殊的函数调用,就以它的调用过程为准。

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. 原C代码如下:  
  2. /*stack.c*/  
  3. #include <stdio.h>  
  4.   
  5. int main()  
  6. {  
  7.     return 0;  
  8. }  

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. 通过gcc -S -o stack.s stack.c得到汇编代码  
  2.     .file   "stack.c"  
  3.     .text  
  4.     .globl  main  
  5.     .type   main, @function  
  6. main:  
  7. .LFB0:  
  8.     .cfi_startproc  
  9.     pushl   %ebp  
  10.     .cfi_def_cfa_offset 8  
  11.     .cfi_offset 5, -8  
  12.     movl    %esp, %ebp  
  13.     .cfi_def_cfa_register 5  
  14.     movl    $0, %eax    /*将返回值保存在eax中*/  
  15.     popl    %ebp        /*由于在该函数中,没有使用到栈,所以esp未变化,不需要恢复。*/  
  16.     .cfi_def_cfa 4, 4  
  17.     .cfi_restore 5  
  18.     ret  
  19.     .cfi_endproc  
  20. .LFE0:  
  21.     .size   main, .-main  
  22.     .ident  "GCC: (GNU) 4.6.2 20111027 (Red Hat 4.6.2-1)"  
  23.     .section    .note.GNU-stack,"",@progbits  


[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. 将c代码修改如下:  
  2. #include <stdio.h>  
  3. int main()  
  4. {  
  5.     int c = 1;  
  6.     return 0;  
  7. }  
  8. 对应的汇编代码如下:  
  9.     .file   "stack.c"  
  10.     .text  
  11.     .globl  main  
  12.     .type   main, @function  
  13. main:  
  14. .LFB0:  
  15.     .cfi_startproc  
  16.     pushl   %ebp        /*原堆栈栈顶存放着原栈帧的ebp*/  
  17.     .cfi_def_cfa_offset 8  
  18.     .cfi_offset 5, -8  
  19.     movl    %esp, %ebp  /*将原堆栈地址放在ebp中,即新的栈帧的地址*/  
  20.     .cfi_def_cfa_register 5  
  21.     subl    $16, %esp   /*堆栈发生变化*/  
  22.     movl    $1, -4(%ebp)  
  23.     movl    $0, %eax  
  24.     leave           /*等效于 movl %ebp, esp; popl %ebp  首先需要恢复原栈顶指针,然后再根据栈顶指针恢复原栈帧的ebp*/  
  25.     .cfi_restore 5  
  26.     .cfi_def_cfa 4, 4  
  27.     ret  
  28.     .cfi_endproc  
  29. .LFE0:  
  30.     .size   main, .-main  
  31.     .ident  "GCC: (GNU) 4.6.2 20111027 (Red Hat 4.6.2-1)"  
  32.     .section    .note.GNU-stack,"",@progbits  
以上可以很清楚地看出leave的作用,和什么时候用leave,什么使用可以直接使用popl。

这篇关于ATT汇编leave指令的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/687753

相关文章

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

工作常用指令与快捷键

Git提交代码 git fetch  git add .  git commit -m “desc”  git pull  git push Git查看当前分支 git symbolic-ref --short -q HEAD Git创建新的分支并切换 git checkout -b XXXXXXXXXXXXXX git push origin XXXXXXXXXXXXXX

笔记整理—内核!启动!—kernel部分(2)从汇编阶段到start_kernel

kernel起始与ENTRY(stext),和uboot一样,都是从汇编阶段开始的,因为对于kernel而言,还没进行栈的维护,所以无法使用c语言。_HEAD定义了后面代码属于段名为.head .text的段。         内核起始部分代码被解压代码调用,前面关于uboot的文章中有提到过(eg:zImage)。uboot启动是无条件的,只要代码的位置对,上电就工作,kern

Android中如何实现adb向应用发送特定指令并接收返回

1 ADB发送命令给应用 1.1 发送自定义广播给系统或应用 adb shell am broadcast 是 Android Debug Bridge (ADB) 中用于向 Android 系统发送广播的命令。通过这个命令,开发者可以发送自定义广播给系统或应用,触发应用中的广播接收器(BroadcastReceiver)。广播机制是 Android 的一种组件通信方式,应用可以监听广播来执行

mysql中导入txt文件数据的操作指令

1 表tt的格式:    CREATE TABLE `tt` (   `ind` int NOT NULL auto_increment,   `name` char(100) default NULL,   PRIMARY KEY  (`ind`)  )   2 文件d.txt的内容示例:  1,a  2,b  3,c

可选择的反思指令微调

论文:https://arxiv.org/pdf/2402.10110代码:GitHub - tianyi-lab/Reflection_Tuning: [ACL'24] Selective Reflection-Tuning: Student-Selected Data Recycling for LLM Instruction-Tuning机构:马里兰大学, Adobe Research领

驱动安装注册表指令

HKCR: HKEY_CLASSES_ROOT HKCU: HKEY_CURRENT_USER HKLM: HKEY_LOCAL_MACHINE HKU: HEKY_USER HER: 相对根键

汇编:嵌入式软件架构学习资源

成为嵌入式软件架构设计师需要掌握多方面的知识,包括嵌入式系统、实时操作系统、硬件接口、软件设计模式等。 以下是一些推荐的博客和网站,可以帮助你深入学习嵌入式软件架构设计: ### 1. **Embedded.com**    - **网址**: [Embedded.com](https://www.embedded.com/)    - **简介**: 这是一个专注于嵌入式系统设计的专业网

4G模块、WIFI模块、NBIOT模块通过AT指令连接华为云物联网服务器(MQTT协议)

MQTT协议概述 MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,它被设计用来提供一对多的消息分发和应用之间的通讯,尤其适用于远程位置的设备和高延迟或低带宽的网络。MQTT协议基于客户端-服务器架构,客户端可以订阅任意数量的主题,并可以发布消息到这些主题。服务器(通常称为MQTT Broker)则负责接受来自客户端的连接请求,并转发消

matlab一些基本重要的指令

重点内容 运行MATLAB的帮助demo,在Command Window 输入 “demo”,或在Launch Pad 选项卡“demos” 任何时候都可以: 清除Command Window内容:clc 清除Figure Window(图形窗口) clf 清除workspace 变量内容: clear 注意:M脚本文件和输入指令中的变量都在workspace中,为避免变量冲突,一般在