摘要:标识符和表达式是程序设计经常用到的两个概念,在用高级语言编程的时候,如果程序要对某个变化的量进行处理时,通常要对该变化的量定义一个具有某种数据类型的符号名,用该符号名也就是使用了该变化量,在汇编语言中也是这样,不同的只是说明和引用的方式。 一 标识符 在汇编语言中,标号,内存变量名,子程序名和宏名等都是标识符,一般最多由31个字母,数字以及规定的特殊字符(? @ _ $)等组成,并且不能用数字开...
阅读全文
02 2008 档案
摘要:因为C++要支持函数重载功能,所以实际编译时会对函数的名称进行改写。 所以我们要加extern "C"来修饰一个函数,让该函数不被重写。 但是,如果使用标准调用方式__stdcall来修饰的函数即使使用了extern "C"来限定,仍然会把名字进行改写,这个时候可以使用def模块定义文件来限定函数的名称,不让编译器进行改写。 几种情况: 1 名字被改写 __declspec(dllexpor...
阅读全文
摘要: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的内部数据存储资源,是汇编程序能用到的硬件资源之一,由于存取速度比内存快很多,所以在汇编写程序时,要尽可能充...
阅读全文
摘要:泛型技术的实现方法有多种,比如模板,多态等。 模板是编译时决定,多态是运行时决定,其他的比如RTTI也是运行时确定。 最好用的应该是模板,多态是依靠虚表在运行时查表实现的。 比如一个类拥有虚方法,那么这个类的实例的内存起始地址就是虚表地址,可以把内存起始地址强制转换成int*,取得虚表,然后(int*)*(int*)取得虚表里的第一个函数的内存地址,然后强制转换成函数类型,即可调用来验证虚表...
阅读全文
摘要:用了俩月的ubuntu,7.04和7.10都用了,起初是因为看到其他人的一些对ubuntu的介绍采去尝试的,后来真的被linux的易用性上征服了。 在windows上安装软件,你要购买注册码,否则就要安装破解版,在网上搜索各种破解版,然后提心吊胆的安装,谨防那些 安装免费的百度超级搜吧之类的选项,可是linux的各个成熟发行版则不同,你只需要使用rpm或aptitude即可,而且安装的软件都是自...
阅读全文
摘要:前面六课大体上让我们可以读懂一个汇编程序,现在开始正式学习汇编。 先是汇编的预备知识: 1. 汇编语言的主要特点 一般情况下一条汇编语句由汇编指令和操作数构成,比如MOV AX, BX,意思是把BX寄存器中的值赋予AX寄存器,MOV是汇编指令,AX和BX都是操作数,BX是源操作数,AX是目的操作数。由于CPU的不同,所支持的指令集也不同,所以汇编语言是依赖于具体的CPU的。 汇编语言和机器可以执...
阅读全文
摘要:c++操作sqlserver或者access数据库可以导入msado15.dll来实现,将会根据你import时的参数生成msado15.tlh和msado15.tli文件,这两个文件对msado15.dll中的COM组件类进行的smart pointer的封装。 对于tlh和tli如何封装COM组件类为C++类,我举一个例子,ADO中的Connection类的例子。 在msado15.dll中...
阅读全文
摘要:1. 子程序的定义 如同C语言一样,汇编语言也具备结构化的能力。 首先说子程序的定义格式: 子程序名 PROC [NEAR | FAR] … ;子程序体 子程序名 ENDP PROC和ENDP是子程序的首尾标识,子程序名必须是相同的,子程序可以分为NEAR近调用和FAR远调用,所谓近调用就是只能在同一段内的其他程序调用,而远待用可以被不同段的程序调用。 2. 子程序的调用 所以,根...
阅读全文
摘要:TLB文件是一个说明文件,通过TLB文件,用户可以得知你的DLL文件中的COM接口 以及常量等的信息,这样一来用户才知道你的DLL中有什么接口与常量等,用户才 能用你的接口,当然了,如果你的COM接口只想自己使用,你可以不做TLB文件告诉 其他人这些信息了。 在使用#import引入一个com组件的时候,会自动生成.tlh和.tli两个文件,这个两个文件是对com类的封装,tlh是标准头文...
阅读全文
摘要:#import 指令 1. C++中使用 COM 簡單的方法是用 #import 導入 type library 2. # import 指令將 COM 產生對應的 C++類別,可以用接近於VBScript和Visual Basic的語句操作 COM 3. 使用 #import 命令就可以將該文件導入到我們的程式碼中。type library 的內容將被轉換為描述了 COM Interface 的...
阅读全文
摘要:刚才抓一个网页,发送如下请求 GET /xxx.xxx HTTP/1.1 Host: xxx 然后这样接收对方返回的数据: string strRecv = ""; char* temp = new char[2048]; int rc = recv(conn, temp,2048, 0); strR...
阅读全文
摘要:1. TEST reg/mem, reg/mem/imm - 检测位指令 受影响标志位:CF(0),OF(0),PF,SF和ZF 功能:检测位指令会将源操作数和目标操作数进行逻辑与操作,根据运算结果设置标志位,但是并不保存运算结果到源操作数,只是设置标志位。该指令执行后通常是一条JE,JNE,JZ或JNZ等条件转移指令。 2. 循环指令 循环指令的执行本身并不影响任何标志位,以CX或ECX做为计...
阅读全文
摘要:逻辑运算指令是另外一组重要的常用指令,包括逻辑与AND,逻辑或OR,逻辑非NOT,和异或指令XOR。 1. AND reg/mem, reg/mem/imm - 逻辑与指令 受影响的标志位:CF,OF,PF,SF,ZF 功能:把源操作数和目的操作数进行二进制位的与操作,结果存入源操作数中。 2. OR reg/mem, reg/mem/imm - 逻辑或指令 受影响的标志位:CF,OF,PF...
阅读全文
摘要:算术运算指令是反映CPU运算能力的指令,也是编程时候最常用到的一组指令,包括加减乘除以及相关的辅助指令。 该组指令的操作数可以是8位,16位,32位(80386+),当存储单元是该类指令的操作数的时候,该操作数的寻址方式可以是任何一种存储单元的寻址方式。 1. 加法指令 ADD reg/mem, reg/mem/imm - 加法指令 受影响的标志位:AF CF OF PF SF ZF 功能...
阅读全文
摘要:这第二篇是介绍Find的用法的,专门用来介绍Find。 Find按功能分为六个方法,每个方法都拥有四个重载,总共二十四个方法。(24个find.汗..) find 查找并返回位置。 rfind 反向查找并返回位置(只是从后往前进行查找,返回的位置是相对于串首而不是串尾)。 find_first_of 查找包含子串中的任何字符,返回第一个位置。 find_last_of 查找包含子串中的任何字...
阅读全文
摘要:升级到unbuntu7.10后竟然经常死机,特别是打开virtualbox的时候 发现cpu和内存很紧张,于是打开进程管理器发现了一个进程一直占用cpu%50,因为我是双核的,一个核心总是被它占用,然后我去网上查了一下trackerd,发现有人说改软件有bug,于是我使用sudo apt-get remove trackerd卸载,发现找不到trackerd,重新输入sudo apt-get r...
阅读全文
摘要:先写几个英文简写及含义。 reg - 寄存器 mem- 内存 lmm - 立即数 1. 传送指令MOV reg/mem reg/mem/lmm 传送指令,相当于高级语言的赋值语句,把源操作数(reg/mem/lmm)传送到前面的寄存器和内存地址中。 2. 传送填充指令MOVSX/MOVZX reg/mem reg/mem/lmm 传送填充指令,和MOV语句具有相同功能的基础上,对目的操作数...
阅读全文
摘要:开始写每日一课,一共75篇,两个多月应该能写完。 1 通用寄存器: 寄存器是学习汇编知识时的第一课,常用寄存器如下: AX/EAX BX/EBX CX/ECX DX/EDX 是通用的数据寄存器 用于暂时存放计算过程中的操作数 结果 或者其他信息。他们可以分为两个独立的8位寄存器使用,AL/AH BL/BH CL/CH DL/DH,除了通用功能之外还有以下用途: AX/EAX作为累加器...
阅读全文
摘要:函数的污染问题主要有以下几点: 1 传递地址和引用传参,在函数内部污染了外部的变量。 2 返回值不确定,有可能是运算结果,还有可能是错误和异常代码。 针对以上两个污染问题的解决方案: 1 用const修饰符修饰型参,做一次隐式类型转换,将参数转换成常量参数,使函数内部不能修改。 2 使用throw抛出异常,在函数调用处try..catch,使返回值确定为运算结果,而不是错误代码。 ok
阅读全文
摘要:三年前,我学习C++,了解了范型编程,当时仅仅是知道怎么回事而已,但是我知道这个东西是为了代码复用而发明的,有了他,你可以少写很多代码,因为在编译的时候他自己会生成相应类型的函数,可以不用去写针对每种数据类型的相同功能的函数,但是由于当时年幼加上范型的难以掌握,我没能深入研究下去。 两年前,我学习C#,明白了多态是怎么回事,并且刨根问底的看了多态的实现,我明白这个东西也是为了代码复用而发明的,有...
阅读全文
摘要:在c/c++中经常会使用到const修饰符,使用改修饰符则表示改变量不能修改。 有些人会举出反例,比如这样: Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> int a = 5; int* const p = &a; ...
阅读全文
摘要:anyone who... risk... 任何..的人都会冒 ...的危险。 anyone who broke the law risked punishment. 任何触犯了法律的人都冒着被处罚的危险。
阅读全文
摘要:He just showed up from out of nowhere. 他突然不知道从什么地方冒出来。 英语中经常用out of nowhere形容一个人突然出现,不知道从哪里出来。 show up,出现的意思。
阅读全文
摘要://declare TCHAR tstrCurrentPath[MAX_PATH]; //initialize memset(tstrCurrentPath, 0, MAX_PATH); //Get GetCurrentDirectory(MAX_PATH, tstrCurrentPath); ...
阅读全文
摘要:1. 写ini文件API原型 BOOL WritePrivateProfileString( LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpString, LPCTSTR lpFileName ); 2. 读ini文件的字符串键值API原型 DWORD GetPrivateProfileString( LPCTSTR lpAppName, L...
阅读全文
摘要:常见的内存分配和使用错误 1) 内存的申请和分配并没有成功,但程序员却使用了它。一些新手经常会犯这种错误,他们并不会留意到内存没有分配成功。判断指针的值是否为NULL可以有效地避免这种错误。 2) 内存的分配已经成功,但是却没有进行初始化就直接使用它了。首先是观念上的问题,很多人都没有在使用指针前要初始化这样的习惯,然而这个习惯却是很重要的,希望大家一定要强迫自己养成。第二就是主观地认为自己...
阅读全文
摘要:Nails that project from the chair may hurt you. 椅子上伸出的钉子会伤到你。 project在这里的意思不是项目,解决方案了,而是伸出,突出的意思。
阅读全文
摘要:I don't have all day. 我没有多少时间跟你耗。我没多少时间。 这句话主要用在抱怨对方拖拖拉拉时说的,意思就是我没有太多的时间跟你耗下去。 I don't have all day.
阅读全文

浙公网安备 33010602011771号