
x86架构/汇编/链接
prece
这个作者很懒,什么都没留下…
展开
-
x86栈帧布局简记
x86栈帧布局简记2008-01-24 01:27<br /> 虽然不用汇编做开发,但在C/C++中定位一些core问题时需要查看堆栈结构,所以对堆栈布局要有一个基本的了解,但长期不接触就又忘了,因此在这里做个简记,以备用到的时候可以快速记起。当函数P调用函数Q时,Q的参数是放在P的帧中的,且P中的下一条指令地址将被压入栈中,形成P的栈帧的末尾。Q的栈帧从保存帧指针的位置开始,后面开始保存其他寄存器的值。大多数信息的访问都是相对于帧指针(%ebp)的。如果函数要返回整数或指针的话,常用寄存器%e转载 2010-11-03 22:45:00 · 851 阅读 · 0 评论 -
LMA和VMA
原文可见:http://blog.ednchina.com/conan85420/393994/message.aspx标签: LMA与VMA LMA与VMALMA 详解LMA的英文原版解释:LMA(Load Memory Address): the address at which the section will be loaded.什么是Load Memory Address,内存装载地址呢? 此处,单单从名字上,我们就可以看出几层意思:load,装载为何要装载呢? 因为,如果想要使你的程序(即经历转载 2010-11-03 22:01:00 · 567 阅读 · 0 评论 -
x86寄存器
x86寄存器说明ebp和esp是32位的SP,BP esp是堆栈指针 ebp是基址指针 ESP与SP的关系就象AX与AL,AH的关系. 32位CPU所含有的寄存器有: 4个数据寄存器(EAX、EBX、ECX和EDX) 2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP) 6个段寄存器(ES、CS、SS、DS、FS和GS) 1个指令指针寄存器(EIP) 1个标志寄存器(EFlags) 1、数据寄存器 数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的转载 2010-11-03 22:06:00 · 454 阅读 · 0 评论 -
函数调用方式(__cdecl, _stdcall, _fastcall, _thiscall, etc)
__cdecl目录几种函数调用方式几种调用约定的区别名字修饰约定设置方法编辑本段几种函数调用方式 __cdecl 是C DECLaration的缩写(declaration,声明),表示C语言默认的函数调用方法:所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈。被调用函数不需要求调用者传递多少参数,调用者传递过多或者过少的参数,甚至完全不同的参数都不会产生编译阶段的错误。 _stdcall 是StandardCall的缩写,是C++的标准调用方式:所有参数从右到左依次入栈,如果是调用类转载 2010-11-04 12:39:00 · 549 阅读 · 0 评论 -
链接--地址重定位
什么叫做重定位?以上内容来自:张不同的《计算机操作系统教程》6.1 存储器的基本概念 主存储器管理仍然是今天操作系统十分重要的内容;能否合理而有效的使用主存,在很大成度上反映了操作系统的性能,并直接影响到整个计算机系统作用的发挥。6.1.1 存储器的层次 目前在许多计算机系统中,采用三级存储器结构,即高速缓冲存储器、主存储器和外部存储器。三级存储器的比较 从高速缓存到外存,其容量愈来愈大,一般每级之间相差几个数量级。而访问数据的速度则愈来愈慢,价格也愈来愈便宜。 6.1.2 地转载 2010-11-04 16:38:00 · 1389 阅读 · 1 评论 -
可执行文件格式
<br /><br />UNIX/LINUX 平台下三种主要的可执行文件格式:a.out(assemblerand link editor output汇编器和链接编辑器的输出)、COFF(Common Object File Format 通用对象文件格式)、ELF(Executableand Linking Format 可执行和链接格式)。<br />首先是对可执行文件格式的一个综述,并通过描述 ELF文件加载过程以揭示可执行文件内容与加载运行操作之间的关系。随后依此讨论了此三种文件格式,并着重讨论转载 2010-11-05 12:33:00 · 1659 阅读 · 0 评论 -
X86架构上函数调用过程的堆栈
理解调用栈最重要的两点是:栈的结构,EBP寄存器的作用。首先要认识到这样两个事实: 1、一个函数调用动作可分解为:零到多个PUSH指令(用于参数入栈),一个CALL指令。CALL指令内部其实还暗含了一个将返回地址(即CALL指令下一条指令的地址)压栈的动作。 2、几乎所有本地编译器都会在每个函数体之前插入类似如下指令:PUSH EBP; MOV EBP ESP;即,在程序执行到一个函数的真正函数体时,已经有以下数据顺序入栈:参数,返回地址,EBP。由此得到类似如下的栈结构(参数入栈顺序跟调用方式有关,这转载 2010-11-05 10:25:00 · 459 阅读 · 1 评论 -
可变参数学习笔记
前言:本文在很大程度上改编自网友kevintz的“C语言中可变参数的用法”一文,在行文之前先向这位前辈表示真诚的敬意和感谢。一、什么是可变参数我们在C语言编程中有时会遇到一些参数个数可变的函数,例如printf()函数,其函数原型为: int printf( const char* format, ...); 它除了有一个参数format固定以外,后面跟的参数的个数和类型是可变的(用三个点“…”做转载 2011-06-27 09:05:00 · 427 阅读 · 0 评论