首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

RISC-V 函数调用约定和Stack使用

RISC-V 函数调用约定和Stack使用 引言 MIT 6.S081 2020 操作系统 本文为MIT 6.S081课程第五节重点笔记整理。...在日常生活中,可能已经在完全不知情情况下使用了精简指令。比如说ARM也是一个精简指令,高通Snapdragon处理器就是基于ARM。...假设我们在函数a中调用函数b,任何被函数a使用并且是Caller Saved寄存器,调用函数b可能重写这些寄存器。...Stack level 0,表明这是调用最底层 pc,当前程序计数器 saved pc,demo4位置,表明当前函数要返回位置 source language c,表明这是C代码 Arglist...---- 补充 函数调用约定 寄存器约定 ---- 函数跳转和返回指令编程约定 ---- 被调用函数编程约定 ---- RISC-V 汇编与 C 混合编程 RISC-V 汇编调用 C 函数

48440

CCPP函数调用原理 | 函数指针 | 堆栈隐患

使用例子 函数调用过程 执行这些汇编指令,看看内存是如何记录函数调用轨迹: 首先从main函数开始,第一条push指令,把rbp寄存器值存入内存。...,就可能出现水位线超标的情况,如使用函数递归产生问题,堆栈溢出。...func_1使用常规函数调用,func_2使用非常规函数调用,发现汇编指令完全相同。 函数指针也可以叫做函数类型变量。...函数指针虽然灵活但是无法看出它调用是那一个函数,因此函数指针会损害程序可读性。 PS: 无论是普通变量,函数指针,指针变量都是变量,都是某个内存地址别名,只是存放数据用途不同才做了细分。...堆栈隐患 实例:编写一个程序:其中malfunc()函数被认为是恶意函数代码,func()是正常函数代码,目前没有机会调用malfunc()函数,但是利用堆栈隐患可以使恶意函数malfunc()被调用

80810

windows平台调用函数堆栈追踪方法

,以及具体调用反汇编代码,但是对于有的时候我们需要直接得到函数名称,这个时候据不能使用这个方法,对于这种需求我们可以使用函数:SymInitialize、StackWalk、SymGetSymFromAddr...原理 基本上所有高级语言都有专门为函数准备堆栈,用来存储函数中定义变量,在C/C++中在调用函数之前会保存当前函数相关环境,在调用函数时首先进行参数压栈,然后call指令将当前eip值压入堆栈中...,然后调用函数函数首先会将自身堆栈栈底地址保存在ebp中,然后抬高esp并初始化本身堆栈,通过多次调用最终在堆栈段形成这样布局 这里对函数原理做简单介绍,有兴趣可以看我另一篇关于...SymCleanup:清楚这个初始化相关环境,在调用SymInitialize之后需要调用SymCleanup,进行释放资源操作 StackWalk:程序功能主要由这个函数实现,函数会从初始化时堆栈顶开始向下查找下一个堆栈信息...当然可以在调用前简单计算,找出在哪个位置是所有函数都没有调用完成,不过这样可能就与程序初衷相悖,毕竟程序本身就是为了获取堆栈调用信息。。。。 2.

3K20

函数调用三种约定,你都清楚吗

函数调用,涉及参数传递,返回值传递,调用后返回,这都是通过栈变化来实现,对于三种调用约定而言: __cdecl: C/C++默认方式,参数从右向左入栈,主调函数负责栈平衡。...下面从实例来认识一下这三种调用约定。先来看一个简单不能再简单程序了: ? 三个函数内容都是一样,不同使用了三种调用方式。我们先来看看在main函数调用三个函数时候汇编代码: ?...调用函数之前连续进行了两次push操作将函数所需实参5和2先后压入了栈区,调用完成后,我们需要恢复调用状态,则需调整栈顶指针esp位置,这一工作由谁来完成就决定了两种函数调用方式__cdecl(...这样,不需要主调函数调用add指令为ESP操作平衡栈区,节约了程序开销,一条指令开销小,如果十万百万个这样调用,这个开销就明显了。...说完了__cdecl和__stdcall,再来看看__fastcall,如前面图看到调用时并未使用push指令向栈里传参数,而是使用了 mov edx, 5 mov ecx, 2 两条指令

98210

关于函数参数入栈思考(函数调用约定,入栈顺序)

由于这种约定,C调用约定允许函数参数个数是不固定,这也是C语言一大特色。...因为每个调用地方都需要生成一段清理堆栈代码,所以最后生成目标文件较__stdcall、__fastcall调用方式要大,因为每一个主调函数在每个调用地方都需要生成一段清理堆栈代码。...和__stdcall类似,它约定内容有: (1) 函数第一个和第二个DWORD参数(或者尺寸更小)通过ecx和edx传递,其他参数通过从右向左顺序压栈; (2)被调用者清理堆栈;...使用__fastcall方式无法用作跨编译器接口。 __thiscall调用约定 是唯一一个不能明确指明函数修饰,因为thiscall不是关键字。它是C++类成员函数缺省调用约定。...this指针在所有参数压栈后被压入堆栈; (3)对参数个数不定调用者清理堆栈,否则函数自己清理堆栈

2.4K31

oracle函数调用使用execute命令_matlab函数调用

大家好,又见面了,我是你们朋友全栈君。 之前一直使用MySQL数据库,第一次接触Oracle就用到了函数和存储过程,今天跟大家分享一下使用过程....调用Oracle函数,返回游标. controller层没什么内容,我们直接从实现类说起:new 一个map,将函数入参,put进这个map中, 然后将这个map传进去mapper ,最后从这个map...中根据游标名,取出数据,强转成list 就可以了 图片 在mapper层 大概就是这样了.存储过程调用也是类似的 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。...如发现本站有涉嫌侵权/违法违规内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

2.1K10

Java 诊断工具 Arthas 常见命令使用和实战(排查函数调用异常、热更新、调用方法函数、查看堆栈调用等)

这个有点秀啊 调用static函数 ognl '@java.lang.System@out.println("hello ognl")' 获取静态类静态字段 获取UserController类里logger...实操案例 排查函数调用异常 通过curl 请求接口只能看到返回异常,但是看不到具体请求参数和堆栈信息。...使用tt命令获取到spring context tt即 TimeTunnel,它可以记录下指定方法每次调用入参和返回信息,并能对这些不同时间下调用进行观测。...使用tt命令从调用记录里获取到spring context tt -i 1000 -w 'target.getApplicationContext()' 获取spring bean,并调用函数 tt...跟踪所有的Filter函数 开始trace: trace javax.servlet.Filter * 可以在调用最深层,找到AdminFilterConfig$AdminFilter返回了401

2.5K40

逆向知识十一讲,识别函数调用约定,函数参数,函数返回值.

逆向知识十一讲,识别函数调用约定,函数参数,函数返回值....在反汇编中,我们常常会看到各种函数调用,或者通过逆向手段,单独使用这个函数,那么此时,我们就需要认识一下怎么识别函数了....识别参数类型:   参数类型还是很好识别了,使用参数地方用直接是4个字节寄存器,那么我们可以暂定为int类型 识别调用约定   如果在函数外面平栈,那么就是C调用约定,从识别参数来看,函数内部...识别参数类型,看其参数是怎么使用.   3.识别调用约定,看其函数内部是否平栈   4.识别返回值类型,看其eax是否是被重写,如果被重写,则是返回值是int类型 2.返回值 __int64 C调用约定...讲解:   1.识别C约定和上面一样,外面平栈   2.识别参数,看其我们函数调用处,发现有三个push,如果不知道,则会陷入坑,直接认为是三个参数.

2.2K90

JavaScript this 小结纯粹函数调用作为对象方法调用作为构造函数调用apply 调用

JavaScript 语言一个关键字。 它是函数运行时,在函数体内部自动生成一个对象,只能在函数体内部使用。 ? 上面代码中,函数test运行时,内部会自动有一个this对象可以使用。...那么,this值是什么呢? 函数不同使用场合,this有不同值。 总的来说,this就是函数运行时所在环境对象。...下面分情况,详细讨论 纯粹函数调用 函数最通常用法,属全局性调用,this即代表全局对象。 ?...运行结果是1 作为对象方法调用 函数还可以作为某个对象方法调用,这时this就指这个上级对象 ? 结果:1 作为构造函数调用 通过这个函数,可以生成一个新对象。this就指这个新对象。 ?...运行结果为2,表明全局变量x值根本没变。 apply 调用 apply()是函数一个方法,作用是改变函数调用对象。 它第一个参数就表示改变后调用这个函数对象。

2.6K20

Js 使用new关键字调用函数和直接调用函数区别

,并以相应属性和方法初始化该对象,然后又返回了这个对象,除了使用new操作符且把使用包装函数叫做构造函数之外,这个模式跟工厂模式是一模一样。...person.sayName(); 得出结论:使用new关键字是将函数当作构造函数调用,即为构造对象,若没有人为重写调用构造函数时返回值,那么返回对象是由解析器自己生成。...不使用new关键字调用函数,即为普通函数调用。 随即想到若是函数返回值是function型呢?...alert(test01==test02);//false 虽然浏览器运行结果一样,但是比较结果还是false,因为 Javascript 对于 Object 和 Function 比较是基于引用...),虽然new函数与直接调用函数产生结果等同,但是是两个不同过程,一个是构造对象、一个是函数调用

3.6K10

匿名函数调用_自己调用自己函数

关于函数声明,它最重要一个特征就是函数声明提升,意思是执行代码之前先读取函数声明。这意味着可以把函数声明放在调用语句之后。...例 sun(1,2); //3 function sum(x,y){ alert(x+y); } 而函数表达式在编译时候不会被提前,如下调用函数将会报错 ss(1,2)...; //报错,函数未定义 var ss = function(x,y){ alert(x+y); }; 介绍了函数定义以及JavaScript编译规则,下面正式说一下匿名函数调用...变形写法: (function(x,y){ alert(x+y); }(1,2)); //3(括号在里面) 匿名函数调用写法有很多,下面列举常见几种写法 1、匿名函数前加 void void...发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/186293.html原文链接:https://javaforall.cn

2.5K20

Lua函数冒号调用和点调用

lua冒号函数定义和调用 冒号定义函数self指向函数所属表对象,即self是table类型,通过self表可以:访问挂载在该表下所有冒号定义函数 如,有定义A={},A:b() A:c();...函数b,c都是冒号定义函数,在b,c函数内部self是地址指向A表,在b函数中可以通过self:c()来调用c函数,同理在c函数中也可以通过self:b()来调用b函数 代码示例: local tb...点定义函数中self=nil,不像冒号定义函数那样可以self指向函数所属对象 点调用冒号定义函数调用冒号定义函数,第一个参数传递给self,调用无参时,self=nil local tb={name...--------- self= 第一个参数 self name= nil parm1= 第二个参数 parm2= nil 冒号调用点定义函数 冒号调用点定义函数调用者对象表传递给点定义函数第一个参数...--冒号调用点定义函数调用者对象表传递给点定义函数第一个参数 tb:func2("第一个参数","第二个参数")

3.2K20
领券