C到汇编[1]
这篇文字解释这个问题:C语言函数调用在汇编语言是怎么实现的?栈模型很好的满足了函数调用的需求,以最简单的函数调用说明。
: int add2(int a, int b){return a+b;}
0040B450 push ebp
0040B451 mov ebp,esp
0040B453 sub esp,40h
0040B456 push ebx
0040B457 push esi
0040B458 push edi
0040B459 lea edi,[ebp-40h]
0040B45C mov ecx,10h
0040B461 mov eax,0CCCCCCCCh
0040B466 rep stos dword ptr [edi]
0040B468 mov eax,dword ptr [ebp+]
0040B46B add eax,dword ptr [ebp+0Ch]
0040B46E pop edi
0040B46F pop esi
0040B470 pop ebx
0040B471 mov esp,ebp
0040B473 pop ebp
0040B474 ret
--- No source file ---------------------------------------------------------------------------------------------------------------------------------------
0040B76C int
0040B76D int
0040B76E int
0040B76F int
--- e:\项目\000test\testconsole\main.cpp -----------------------------------------------------------------------------------------------------------------
:
: int main(int argc, char **argv){
0040B770 push ebp
0040B771 mov ebp,esp
0040B773 sub esp,4Ch
0040B776 push ebx
0040B777 push esi
0040B778 push edi
0040B779 lea edi,[ebp-4Ch]
0040B77C mov ecx,13h
0040B781 mov eax,0CCCCCCCCh
0040B786 rep stos dword ptr [edi]
:
: int a = ;
0040B788 mov dword ptr [ebp-],0Ah
: int b = ;
0040B78F mov dword ptr [ebp-],14h
: int c = add2(a, b);
0040B796 mov eax,dword ptr [ebp-]
0040B799 push eax
0040B79A mov ecx,dword ptr [ebp-]
0040B79D push ecx
0040B79E call @ILT+(add2) (0040100a)
0040B7A3 add esp,
0040B7A6 mov dword ptr [ebp-0Ch],eax
:
: return c;
0040B7A9 mov eax,dword ptr [ebp-0Ch]
: }
0040B7AC pop edi
0040B7AD pop esi
0040B7AE pop ebx
0040B7AF add esp,4Ch
0040B7B2 cmp ebp,esp
0040B7B4 call __chkesp (0040b6b0)
0040B7B9 mov esp,ebp
0040B7BB pop ebp
0040B7BC ret
44行执行函数调用,过程如下:
(1)参数入栈,从右向左;
(2)CALL指令,注意CALL指令将EIP入栈,并JMP;
(3)初始化ADD函数堆栈,push ebp; mov ebp, esp;sub esp,0x40; push ebx; push esi; push edi; rep stos ptr dword es:[edi]. rep指令表示,执行循环,循环次数放置在ECX寄存器中;stos指令表示,将EAX值放入edi指向的地址,并将edi递增. 在第10行我们看到EAX被设置为0xCCCCCCCC,所以rep stos ptr dword es:[edi]的作用是,将开辟的0x40局部变量空间初始化为0xCC,0xCC是INT 3的汇编指令,目的是防止误执行。
(4)执行ADD指令,结果存放在EAX中;
(5)恢复现场,pop ebx; pop esi; pop edi;
(6)ret,弹出eip;
(7)保持栈平衡,add esp,8;

C到汇编[1]的更多相关文章
- u-boot源码汇编段简要分析
Hi,大家好!我是CrazyCatJack,你们可以叫我CCJ或者疯猫.今天我给大家带来的是u-boot的源代码汇编段分析,以后还会给大家讲解后续的C代码,请持续关注哦^_^ 先简单说一下u-boot ...
- GCC 预处理、编译、汇编、链接..
1简介 GCC 的意思也只是 GNU C Compiler 而已.经过了这么多年的发展,GCC 已经不仅仅能支持 C 语言:它现在还支持 Ada 语言.C++ 语言.Java 语言.Objective ...
- GDB调试汇编堆栈过程分析
GDB调试汇编堆栈过程分析 分析过程 这是我的C源文件:click here 使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,然后使用gdb ...
- Beennan的内嵌汇编指导(译)Brennan's Guide to Inline Assembly
注:写在前面,这是一篇翻译文章,本人的英文水平很有限,但内嵌汇编是学习操作系统不可少的知识,本人也常去查看这方面的内容,本文是在做mit的jos实验中的一篇关于内嵌汇编的介绍.关于常用的内嵌汇编(AT ...
- 从linux0.11中起动部分代码看汇编调用c语言函数
上一篇分析了c语言的函数调用栈情况,知道了c语言的函数调用机制后,我们来看一下,linux0.11中起动部分的代码是如何从汇编跳入c语言函数的.在LINUX 0.11中的head.s文件中会看到如下一 ...
- C内嵌汇编-格式
C内嵌汇编-格式: __asm__(汇编语句部分:输出部分:输入部分破坏描述部分);C内嵌汇编以关键字"__asm__"或"asm"开始, 下辖四个部分, 各部 ...
- 20145212——GDB调试汇编堆栈过程分析
GDB调试汇编堆栈过程分析 测试代码 #include <stdio.h> short val = 1; int vv = 2; int g(int xxx) { return xxx + ...
- C程序汇编运行模式简析
SJTUBEAR 原创作品转载请注明出处 /<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 1. 汇编 ...
- 生成ARM汇编
使用ndk即可生成arm汇编 1.首先写好hello.c 2.编写makefile #ndk根目录 NDK_ROOT=E:\Android\android-ndk-r10b #编译器根目录 TOOLC ...
- gdb调试汇编堆栈过程的学习
gdb调试汇编堆栈过程的学习 以下为C源文件 使用gcc - g code.c -o code -m32指令在64位的机器上产生32位汇编,然后使用gdb example指令进入gdb调试器: 进入之 ...
随机推荐
- Apache2.4+Tomcat7.0整合配置详解
一.简单介绍 Apache.Tomcat Apache HTTP Server(简称 Apache),是 Apache 软件基金协会的一个开放源码的网页服务器,可以在 Windows.Unix.Lin ...
- C# 重载,重写,代理,枚举实例
1.日期说法时区不同所取到的值也不同, 多个国的服务器要注意这个玩意 DateTime newDate = DateTime.Now; Console.WriteLine(newDate.ToStri ...
- poj 3253 哈夫曼贪心
http://poj.org/problem?id=3253 题意: FJ需要修补牧场的围栏,他需要 N 块长度为 Li 的木头(N planks of woods).开始时,FJ只有一块无限长的木板 ...
- 嗯。。 差不多是第一道自己搞出的状态方程 hdu4502 有一点点变形的背包
吉哥系列故事——临时工计划 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tot ...
- Spring Boot 全局Exception处理
一.代码如下 package com.zxguan; import org.springframework.web.bind.annotation.ControllerAdvice; import o ...
- Junit 学习1 junit的简单使用
package junit; import java.sql.Connection; import java.sql.SQLException; import org.junit.Test; impo ...
- element-ui 日期插件让结束日期大于开始日期
<el-date-picker v-model="addForm.startDate" type="date" size="mini" ...
- linux——运维基础,与常用命令
1 运维概述 1 什么是运维 服务器的运行维护 2 名词 IDC(互联网数据中心) 3 监控软件 zabbix(用的最多), nagios, cactti 4 常用的linux操作系统 1 CentO ...
- Linux下zookeeper集群搭建
Linux下zookeeper集群搭建 部署前准备 下载zookeeper的安装包 http://zookeeper.apache.org/releases.html 我下载的版本是zookeeper ...
- Java&Selenium调用JS实现高亮被操作页面元素高亮
Java&Selenium调用JS实现高亮被操作页面元素高亮 /* * the method of invoking js to do something * * @author daviey ...