第一次接触C语言裸函数

先上代码:

naked.cpp:

#include "stdafx.h"

extern "C" int __declspec(naked) add2(int x,int y)       //引用说明支持跨文件的调用

{
     __asm{                                                        //函数的环境初始化(升栈、保护现场、填充缓存区)
         PUSH EBP
         MOV EBP,ESP
         SUB ESP,0X40
         PUSH EBX
         PUSH ESI
         PUSH EDI
         LEA EDI,DWORD PTR SS:[EBP-0X40]
         MOV EAX,0XCCCCCCCC
         MOV ECX,0X10
         REP STOSD
     }
     __asm{                                                            //函数功能
         MOV EAX,DWORD PTR SS:[EBP+0X8]
         ADD EAX,DWORD PTR SS:[EBP+0XC]
     }
     __asm{                                                       //恢复现存降栈返回
         POP EDI
         POP ESI
         POP EBX
         MOV ESP,EBP
         POP EBP
         RET
     }

}

====================================================

base.cpp

#include "stdafx.h"

extern "C" int add2(int,int);         //声明外部函数

int _tmain(int argc, _TCHAR* argv[])

{

//test
     int sum=0;

printf ("add2(50,76):%d\n",add2(50,76));

return 0;

今天加深理解的一个C语言函数的运行机制。

时间: 2024-12-05 15:15:36

第一次接触C语言裸函数的相关文章

第一次接触C语言,第一次尝试做的ATM机

#include <stdio.h>#include <string.h> #define LINE "=====================================\n" #define KEY "123456" #define accounts "123456789" int main(){ //设置变量 int num; //用户选项 int m=10000; //账号初始金额 char key[6];

第一次接触oc

第一次接触oc,要明白oc与之前所接触过得C语言不同,oc是面向对象而C语言是面向过程的,对于新手来说分清这2个的区别还是挺困难的. 首先面向过程是一种以事件为中心的编程思想—分析出解决问题所需的步骤,然后用函数把这些步骤一步一步实现,使用的时候一步一步调用. 而面向对象是一种以事物为中心的编程思想,体现在它是把问题分解给各个对象,建立对象不是为了完成一个步骤,而是为了描述某个事物在整个问题的步骤中的行为.力图使计算机语言对事物的描述与现实中改事物的本来面目尽可能一致. 这时候我们 就要了解什么

C语言字符串函数大全

转载自http://www.360doc.com/content/08/0723/22/26860_1462024.shtml# 函数名: stpcpy 功能: 拷贝一个字符串到另一个 用法: char *stpcpy(char *destin, char *source); 程序例: #include<stdio.h> #include<string.h> int main(void) { char string[10]; char *str1 = "abcdefghi

【逆向知识】裸函数(Naked函数)

1 说明 指定裸函数编写的函数,编译器生成不带任何多余代码. 利用此功能,可以使用内联汇编程序代码编写自己的 prolog/epilog 代码序列. 裸函数对于编写虚拟设备驱动程序特别有用. 2 练习目的 熟悉堆栈结构 参数.局部变量的位置 返回值存储的位置 3 代码实现 // 20180217_裸函数.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" // 两数相加函数 int add(int x, int y) { return x+y; }

Go语言入门——函数

写了快一个月的Go,已经没有什么陌生感了. 一行代码写完,不会在行尾本能的敲上“:”,直接Enter键换行: 定义变量把变量名放在前面,类型放在后面: 使用struct去定义自己想要的数据模型就好比定义一个Java中的model一样…… 这些不用可以经过大脑加工思考,就想自己还在写Java一样. 还记得当时在看<Go实战>的时候看到变量类型后置的声明方式,我还在极力吐槽这种不人性的语法,如果我已经站在了真香的队伍里,和其他的真香同学别无二致. 感慨,人的适应能力真的强?? 作为一个Java重度

R语言封装函数

R语言封装函数 原帖见豆瓣:https://www.douban.com/note/279077707/ 一个完整的R函数,需要包括函数名称,函数声明,函数参数以及函数体几部分. 1. 函数名称,即要编写的函数名称,这一名称就作为将来调用R函数的依据.2. 函数声明,函数名称 <- function, 即声明该对象的类型为函数.3. 函数参数,这里是输入的数据,函数参数是一个虚拟出来的一个对象.函数参数所等于的数据,就是在函数体内部将要处理的值,或者对应的数据类型. 函数体内部的程序语句进行数据

第一次接触oracle数据库与suse系统心得

第一次搭建oracle用了两天时间.............. 经历了太多的艰难 所以做一些总结 总结,心得: 因为昨天安装多次未成功,所以今天在部署前,先总结了一下昨天出现的问题,提前做好了一些相应的措施,避免了一些不必要的麻烦 先叙述下昨天的大概流程:            昨天在安装的时候,先是在网上找了文档,然后就开始在VMware上部署oracle的运行环境SUSe11 当时VMware上给的配置如下:(处理器1p/1c 内存1G 硬盘10G 等系统安装完成后就开始配置网络,让虚拟机与

[C/C++基础] C语言常用函数sprintf和snprintf的使用方法

Sprintf 函数声明:int sprintf(char *buffer, const char *format [, argument1, argument2, -]) 用途:将一段数据写入以地址buffer开始的字符串缓冲区 所属库文件: <stdio.h> 参数:(1)buffer,将要写入数据的起始地址:(2)format,写入数据的格式:(3)argument:要写的数据,可以是任何格式的. 返回值:实际写入的字符串长度 说明:此函数需要注意缓冲区buffer溢出,要为写入的arg

C语言strlen()函数用法

C语言strlen()函数:返回字符串的长度 头文件:#include <string.h> strlen()函数用来计算字符串的长度,其原型为:unsigned int strlen (char *s);  s为指定的字符串 eg: #include<stdio.h> #include<string.h> int main() { char *str1 = "http://see.xidian.edu.cn/cpp/u/shipin/"; char