源码


很简单的c语言代码,作用是交换两个数:

 #include <stdio.h>

 void swap(int * a, int * b) {
*a = *a + *b - (*b = *a);
return;
}

汇编代码解析


在gcc编译环境下执行, gcc -S  -o test.s test.c 命令生成相关汇编代码。

     .file    "test.c"
.text
.globl _swap
.def _swap; .scl 2; .type 32; .endef
_swap:
LFB6:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset
.cfi_offset , -
movl %esp, %ebp
.cfi_def_cfa_register
movl (%ebp), %eax --将a指向的地址放到寄存器eax中
movl (%eax), %edx --将a指向地址里面的值取出存入寄存器edx
movl (%ebp), %eax --将b指向的地址放到寄存器eax中
movl (%eax), %eax --取出b指向地址里面的值存入寄存器eax中
leal (%edx,%eax), %ecx --计算*a + *b的值并存入寄存器ecx
movl (%ebp), %eax --将a指向的地址放入eax
movl (%eax), %edx --取出a指向地址里面的值放入edx
movl (%ebp), %eax --将b指向的地址放入eax
movl %edx, (%eax) --用a指向地址里面的值覆盖b指向的地址里面的值. ps:(*b = *a)
movl (%ebp), %eax --将b指向的地址放入eax
movl (%eax), %eax --将b指向地址里面的值放入eax (ps:此时b指向的地址中存的值为a)
subl %eax, %ecx --用*a+*b的值减去b指向地址里面的值 (ps:此时b指向的地址里面的值为初始时的*a) ,结果(此时结果等于初始时b指针指向的值*b)存在ecx中
movl %ecx, %edx --将最终结果放入edx
movl (%ebp), %eax --将a指针地址放入eax

movl %edx, (%eax) --将a指针指向的值改为edx中的最终结果 ps: 此时a指针指向的值为初始时的*b,b指针指向的值为初始时的*a,a,b指针指向的结果已经互换过来了。
nop
popl %ebp
.cfi_restore
.cfi_def_cfa ,
ret
.cfi_endproc
LFE6:
.ident "GCC: (GNU) 4.8.1"

解析c语言背后的汇编代码的更多相关文章

  1. C语言程序转汇编代码

    最近在学着写bootloader,由于汇编太繁杂,希望可以使用C语言完成一部分,然后转成NASM汇编代码,经过摸索,最终找到了一个解决方案,记录于此,留作参考. 核心步骤 使用gcc编译得到.o文件 ...

  2. 分析一个C语言程序生成的汇编代码-《Linux内核分析》Week1作业

    署名信息 郭春阳 原创作品转载请注明出处 :<Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 C源码 这 ...

  3. c语言背后的运行机制

    目的:通过分析c语言转换成汇编代码后的执行过程对汇编语言和X86构架有一个初步认识 实验代码 #include <stdio.h> int g(int x) { ; } int f(int ...

  4. 通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的

    秦鼎涛  <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验一 通过汇编一个简单的C程序,分析汇编代码 ...

  5. 《Linux内核分析》week1作业-分析一个简单c语言的汇编代码

    1.C语言源码 #include <stdio.h> int g(int x){ ; } int f(int x){ return g(x); } int main(){ )+; } 2. ...

  6. Keil 中关于C语言编译生成汇编代码函数名规则

    在keil 中 C语言的函数有带参数和不带参数之分. 一般的资料里说fun(void)类型的函数不带参数,所以,keil编译器生成的汇编的调用地址(函数名) 为fun.这没有错.事实上,不管C语言的函 ...

  7. 浅析VS2010反汇编 VS 反汇编方法及常用汇编指令介绍 VS2015使用技巧 调试-反汇编 查看C语言代码对应的汇编代码

    浅析VS2010反汇编 2015年07月25日 21:53:11 阅读数:4374 第一篇 1. 如何进行反汇编 在调试的环境下,我们可以很方便地通过反汇编窗口查看程序生成的反汇编信息.如下图所示. ...

  8. c语言if语句是如何变成汇编代码的?

    1. 要编译的测试代码: int a; int b = 3; int main(void) { if (3) a = 4; else b = 5; } 2. 词法分析 词法分析将c源代码解析成一个个的 ...

  9. 32位汇编第三讲,RadAsm,IDE的配置和使用,以及汇编代码注入方式

    32位汇编第三讲,RadAsm,IDE的配置和使用,以及汇编代码注入方式 一丶RadAsm的配置和使用 用了怎么长时间的命令行方式,我们发现了几个问题 1.没有代码提醒功能 2.编写代码很慢,记不住各 ...

随机推荐

  1. div+css的叫法是不正确的

    为什么国人将这种布局标准页面的方法叫做DIV+CSS? 因为第一个将这种技术引进中国的人,对这门技术理解不够透彻,单纯从代码上辨别过去的页面布局方法和现在流行的页面布局方法,认为过去布局页面用的是Ta ...

  2. combobox只读代码

    public partial class Form1: Form { // combobox只读代码 [DllImport("user32.dll", CharSet = Char ...

  3. FileZilla 无法保存密码

    当保存密码时遇到这个问题时: 解决办法: 一.找到FileZilla的设置: 二.点击"界面",取消勾选"不要保存密码",点击"确定"按钮, ...

  4. php 用post请求调用接口api

    $post_data=""; $ch = curl_init(); $url = ''; curl_setopt($ch , CURLOPT_URL , $url); curl_s ...

  5. tomcat context标签中resource配置

  6. 性能测试工具--SIEGE安装及使用简介

    官方网站http://www.joedog.org/ 概述 Siege是一个多线程http负载测试和基准测试工具.它有3种操作模式: 1) Regression (when invoked by bo ...

  7. 『安全工具』注入神器SQLMAP

    Pic by Baidu 0x 00 前言 正是SQLMAP这种神器的存在,SQL注入简直Easy到根本停不下来.... PS:国内类似软件也有阿D,明小子,挖掘机,当你用过他们之后你才会发现SQLM ...

  8. SQLServer备忘

        1,创建主键有三种方式,尤其注意联合主键: (1) (2) (3)   2,修改主键的方式       2,创建外键应该也有三种方式:

  9. Smarty include使用

    {include} {include}用于载入其他模板到当前模板中. 在包含模板中可用的变量,载入后在当前模板仍然可用. {include}必须设置file 属性,设置载入的文件资源路径. 设置了可选 ...

  10. 高性能Java解析器实现过程详解

    如果你没有指定数据或语言标准的或开源的Java解析器, 可能经常要用Java实现你自己的数据或语言解析器.或者,可能有很多解析器可选,但是要么太慢,要么太耗内存,或者没有你需要的特定功能.或者开源解析 ...