ARM 堆栈方式

满堆栈(Full Stack,“F”)是指Sp指向堆栈最后一个压入的数据(也就是sp指向堆栈最后一个数据项位置)。

空堆栈(Empty Stack,"E")是指sp指向堆栈下一个将要放入数据的空位置时(也就是说sp指向堆栈最后一个数据项的下一个位置)。

存储器堆栈可以分为两种:

一种是向上生长,就是向着高地址方向生长,称为递增堆栈。
一种是向下生长,就是向着低地址方向生长,称为递减堆栈。

这样,就有四种组合:满递增(FA)、空递增(EA)、满递减(FD)、空递减(ED)。

入栈规律:

(1)满堆栈操作先调整SP,然后存入数据。

(2)空堆栈操作先存入数据,然后调整SP。

(3)递增堆栈调整SP时,执行SP=SP+4

(4)递减堆栈调整SP时,执行SP=SP-4

出栈规律 正好与入栈相反,也就是入栈的逆操作。

(1)空堆栈操作先调整SP,然后存入数据。

(2)满堆栈操作先存入数据,然后调整SP。

(3)递减堆栈调整SP时,执行SP=SP+4

(4)递增堆栈调整SP时,执行SP=SP-4

 

例1:

PRE
r1 = 0x00000002
r4 = 0x00000003
sp = 0x00080014

STMFD sp!, {r1, r4}

POST
r1 = 0X00000002
r4 = 0x00000003
sp = … Read More

IDA 中MFC导入符号名修复脚本

1) dumpbin /exports mfc100u.lib > mfc100u.def
2) using following regex: ^\s+(\d+)\s+([^\s]{1,})(.*) -> \2 @ \1 NONAME

从Def文件生成idc脚本, 进行重命名

https://pan.baidu.com/s/1dGkQc5V :  ee4b

压缩包中包含了 MFC70, 71, 80, 90, 100的相应脚本
如果需要其它的, 压缩包中有脚本可以生成

 

 … Read More

VS 常见编译错误解决方案

错误一:
nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) 已经在 LIBCMTD.lib(new.obj) 中定义
nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) 已经在 LIBCMTD.lib(dbgdel.obj) 中定义
nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) 已经在 LIBCMTD.lib(new2.obj) 中定义
nafxcwd.lib(afxmem.obj) : … Read More

Boost库的编译

首先到 Boost的官网下载解压包  http://www.boost.org

解压到自己喜欢的地方.

一、编译

我们以VS2015为例,Boost库1.65.1

进入VS2015的命令行

首先需要先生成 bjam.exe (b2.exe)

运行 bootstrap.bat 等待bjam生成。

然后开始编译Boost库

bjam stage --toolset=msvc-14.0 --without-graph --without-graph_parallel --stagedir="D:\boost\boost_1_65_1\bin\vc14" link=static runtime-link=shared runtime-link=static threading=multi debug release

接下来就是等待了,大约几分钟的时间,就编译好了。可以包含目录使用了。

下面详细解释一下每个参数的含义:

stage/installstage表示只生成库(dll和lib),install还会生成包含头文件的include目录。本人推荐使用stage,因为install生成的这个include目录实际就是boost安装包解压缩后的boost目录(E:\SDK\boost\boost,只比include目录多几个非hpp文件,都很小),所以可以直接使用,而且不同的IDE都可以使用同一套头文件,这样既节省编译时间,也节省硬盘空间。

toolset指定编译器,可选的如borland、gcc、msvc(VC6)、msvc-14.0(VS2015)等。

without/with选择不编译/编译哪些库。因为python、mpi等库我都用不着,所以排除之。还有wave、graph、math、regex、test、program_options、serialization、signals这几个库编出的静态lib都非常大,所以不需要的也可以without掉。这可以根据各人需要进行选择,默认是全部编译。但是需要注意,如果选择编译python的话,是需要python语言支持的,应该到python官方主页http://www.python.org/下载安装。查看boost包含库的命令是bjam --show-libraries

stagedir/prefixstage时使用stagedir,install时使用prefix,表示编译生成文件的路径。推荐给不同的IDE指定不同的目录,如VS2008对应的是E:\SDK\boost\bin\vc9,VC6对应的是E:\SDK\boost\bin\vc6,否则都生成到一个目录下面,难以管理。如果使用了install参数,那么还将生成头文件目录,vc9对应的就是E:\SDK\boost\bin\vc9\include\boost-1_46\boost,vc6类似(光这路径都这样累赘,还是使用stage好)。

build-dir Read More