摘要:
我下午写过__stdcall和__cdecl的异同了,都是从右向左将参数压入栈中,只不过我当时说__stdcall是自己清空栈,而__cdecl是主调代码环境清空栈,于是我刚才写了两个函数,用VC8.0编译器编译后反汇编得到汇编代码。 C++代码如下: .h头文件 #pragma once #ifdef DLLTestAPI #else #define DLLTestAPI _declspe... 阅读全文
摘要:
操作数就是指令或者程序的主要处理对象,只有很少数的指令不需要操作数,因为他们不具备数据处理功能,比如NOP空指令和HLT停机指令。 大多数指令的执行会涉及到操作数,所以指令中如何表达操作数或操作数所在位置是正确运用汇编指令的重要因素。 在指令中指令操作数或操作数存放位置的方法称为寻址方式。操作数的寻址方式是汇编语言进行程序设计的基础。 1. 立即数寻址方式 操作数作为指令的一部分直接写在指令... 阅读全文
摘要:
__stdcall __cdecl都是修饰函数的调用方式的关键字。 两种调用方式都是从右向左将参数入栈。 __cdecl是c/c++的默认调用方式, __stdcall是WindowsAPI函数的调用方式,是这样分析出来的: 1. 在windef.h文件中可以看到如下定义 #define WINAPI __stdcall 2. 分析一个WindowsApi函数GetCurren... 阅读全文
摘要:
GetCurrentDirectory获取的是程序的运行路径,所谓程序的运行路径,并不一定是程序所在的磁盘路径,而是程序中一些函数的默认工作路径。 这个目录称为 “程序运行时路径” 或者 “环境路径” 更恰当。(比如调用GetOpenFileName函数就会改变这个环境路径) GetModuleFileName获取的是一个当前程序加载的模块的磁盘路径信息,是磁盘路径。 阅读全文
摘要:
大家都知道导出成员用_declspec(dllexport),导入用_declspec(dllimport),可以在头文件的声明部分使用这两个修饰符对函数,类,变量,或类成员函数进行修饰,来表示该成员是一个导入成员或导出成员。 有一个小技巧,就是使用宏定义作为开关控制,让dll项目和调用dll的项目公用一个头文件: 1. dll的代码源文件(cpp文件)中定义一个宏 然后包含头文件 #defin... 阅读全文