因为偶然的机会,工作中同事workshop中讲到了从编译角度理解TI芯片dsp函数的调度过程,主要是函数调度过程中寄存器的使用,这里总结下函数调度过程common的过程。
调用者开始调用函数,1.调用者将函数参数自右向左依次压栈;2.调用者将返回地址压入栈中;3.将寄存器ebp压栈(记录当前调用者栈底指针);4.将esp赋值给ebp(将当前调用者栈顶指针当作该函数的栈底指针);5....
分类:
其他好文 时间:
2014-11-01 23:14:40
阅读次数:
271
接上文: http://blog.csdn.net/prsniper/article/details/40652451
上文中提到的局部变量的地址,第一个是[ebp-4],由于32位内存对齐的原因,第二个是[ebp-8],对于VC7以上的版本,这个地址可能会不一样
比如第一个可能是[ebp-8],第二个飞到[ebp-14],这是VS.NET的VC编译器在每个局部变量前后都加一个DW...
分类:
编程语言 时间:
2014-10-31 15:44:10
阅读次数:
293
逻辑或 ||int i, j, k;i = 0x15;j = 0x41;k = i || j;反汇编代码如下:MOV DWORD PTR SS:[EBP-4], 15MOV DWORD PTR SS:[EBP-C], 41CMP DWORD PTR SS:[EBP-4], 0JNZ SHORT as...
分类:
其他好文 时间:
2014-10-18 11:02:17
阅读次数:
198
//重点在于函数中需要手动push一些寄存器, 且以ebp为基址计算参数的地址.#include "stdafx.h"__declspec(naked)int strcmpA(char *s1, char *s2) //__declspec(naked) 不用编译器自动附带各种push ebp p....
分类:
其他好文 时间:
2014-10-18 10:58:06
阅读次数:
156
//___逻辑取反 !______________________________________________________非零值取反得到0, 0取反得到1int i, j;i = 0x8877;j = !i;反汇编代码:MOV DWORD PTR SS:[EBP-4], 0X4321XOR....
分类:
其他好文 时间:
2014-10-18 10:57:48
阅读次数:
230
EBP 栈底指针(会随进入不同的函数而改变, 更喜欢手动改变, 自动的有时会画蛇添足)ESP栈顶指针(永远指向栈顶)CAL调用函数(隐含操作是将EIP的值入栈, 并将EIP设置为CALL指向的地址)示例:main()函数中的EBP =ESP =12FF7Cvoid fun2(int a, int b...
分类:
其他好文 时间:
2014-10-18 09:44:37
阅读次数:
227
共同点: 从右向左压栈实参. 压栈顺序: 1.压实参 2. 压EIP值 3.进入函数后,压EBP值......区别:__cdecl 返回后ADD ESP, 4 (一个int参数)__stdcall返回前 RETN 04 (一个int参数)__fastcall 如果只有两个参数,则不需...
分类:
其他好文 时间:
2014-10-18 09:42:23
阅读次数:
200
函数的调用操作是从一块代码到另一块代码之间的双向数据传递和执行控制。数据传递:函数参数和返回值。CPU的程序实现使用栈来支持函数调用操作。栈用来传递函数参数、存储返回信息、临时保存寄存器原有值以及存储局部数据。单个函数调用操作所使用的栈部分称为栈帧。栈帧结构的两端由两个指针指定。ebp用作栈帧的指针...
分类:
其他好文 时间:
2014-10-12 10:28:37
阅读次数:
186
Enter的作用相当==push ebp和mov ebp,esp这后面两句大家很熟悉吧?函数开始一般都是这两句Leave的作用相当==mov esp,ebp和pop ebp而这后面这两句也很常见,函数调用完后一般的用到以上的Enter和leave的作用分别函数开始和结束Win32汇编中局部变量的使用...
分类:
其他好文 时间:
2014-08-23 22:56:41
阅读次数:
333
"[]"的用法在"常见问题"已经有所说明,引用如下:1、push dword ptr [024c1100] 压栈024c1100值的双字 2、cmp eax,[ebp+14] eax-ebp+14的有效值,不保留值,主要看标志位 3、cmp byte ptr [eax],46 字节型ea...
分类:
编程语言 时间:
2014-08-21 18:37:44
阅读次数:
266