摘要:
IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值。 示例代码: ==================== ALTER PROCEDURE [dbo].[pr_test] @txt as varchar(100), @last as int output AS BEGIN declare @sql varchar(100) INSERT INTO [tb_... 阅读全文
摘要:
我下午写过__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... 阅读全文
摘要:
存储器的管理模式 intel公司的80x86系列的CPU对内存的管理采用的是内存分段的方式。 1. 存储器的分段 计算机的内存管理单元是以“字节”为最小单位进行线性编址的,字节是80x86CPU对内存管理的基元。为了标识每个存储单元,就给每个存储单元规定一个编号,该编号就是内存单元的物理地址。 存储单元的物理地址是一个16位的二进制数,物理地址通常采用16进制书写。 16位CPU内部拥有20根... 阅读全文
摘要:
专用寄存器有标志位寄存器Flag/EFlag, 段寄存器ES,CS,SS,DS,FS,GS。 标志位寄存器(Flag/EFlag) 16位CPU标志位寄存器有9个二进制位发挥了作用,分别是: 15 14 13 12 11 ... 阅读全文
摘要:
通用寄存器的作用 数据寄存器不讲,简单的说,段寄存器(ES,CS,SS,DS,FS,GS)和变址寄存器(SI,DI)是配合使用访问段数据的,指针寄存器(BP,SP)是用来操作堆栈的,BP指向栈的基址,SP则永远指向栈顶。 另外指令指针EIP存放的是要执行的下一条指令在代码段里的偏移量,在实方式下,每个段的最大范围都是64K,所以EIP的高16位都是0。 ... 阅读全文
摘要:
使用汇编编程时要直接操作硬件资源,如CPU内部资源,存储器和I/O端口,所以一定要学习并记住CPU内部寄存器的命名,功能以及常见的用途,感谢老天,寄存器并不是太多。还有要明白存储器的分段管理模式,存储单元的地址的表示法和物理地址的形成方式,当然也不难理解。 一 寄存器组 寄存器是CPU的内部数据存储资源,是汇编程序能用到的硬件资源之一,由于存取速度比内存快很多,所以在汇编写程序时,要尽可能充... 阅读全文