查询API函数头文件的小程序

我在学习汇编的时候,往往在读别人的程序,或者是在认识了新API函数的时候,不清楚这个函数在那个头文件和导入库中,于是,就写了个小程序. 程序记录如下: ;=========API函数头文件查询器====================;程序功能:给定函数名称,查找该函数在D:\masm32\INCLUDE;目录中所在的头文件.返回头文件名称.;使用编译器:MASMPlus;作者:ONEPROBLEM QQ:962361395;时期:2009年02月07日;================================================ .386 .model f...
2009-02-08 23:27 | 阅读 5993 次 | 评论 1 条

关于GetCursorPos函数

1.GetCursorPos函数只有一个参数:lpPoint ; lpPoint指向一个POINT结构 POINT STRUCT x DWORD ? y DWORD ? POINT ENDS (x,y)坐标是以整个屏幕为参照的,而不是某个应用程序窗口的客户区为参照; 2.应用程序的窗口标题栏的高度大概是38像素.
2008-12-29 21:41 | 阅读 3691 次 | 评论 0 条

全局变量与局部变量

有些朋友在学习罗云彬的<Windows环境下32位汇编语言程序设计>一书第五章的时候,对Menu 例子程序中的关于全局变量与局部变量的用法有些疑惑. 如,在Menu 例子程序中,hSubMenu 这个子菜单句柄变量,如果放在了局部变量中(即窗口过程中),程序正常,却没有弹出菜单;而改为放在全局变量中,才弹出菜单. 为什么? 我在学习该书第五章的"使用图标和光标"内容的时候,也遇到了类似的问题:如果,把hIconBig,hIconSmall,hCur1,hCur2 这几个句柄变量都设为局部变量,则程序虽然编译通过且运行了,但所加载的图标和光标都没有起作...
2008-11-17 10:10 | 阅读 7108 次 | 评论 3 条

调用冒泡排序函数的例子程序

;调用冒泡排序函数的例子程序;作者:ONEPROBLEM;======================== .386 .model flat,stdcall option casemap:none include windows.incinclude user32.incincludelib user32.libinclude kernel32.incincludelib kernel32.lib .dataArray dd 20,30,50,80,100,105Buffer dd 256 dup (?)szCaption db '提示',0szText db ...
2008-10-12 07:52 | 阅读 7170 次 | 评论 0 条

用汇编实现冒泡排序算法的函数

;用汇编实现冒泡排序的函数;参数说明:_lpData是待排序的数组首地址,_dwCount是待排序的个数,_dwOption设为0则由小到大排序;如果是非0值,则是由大到小排序.;返回值:已排序数据放回原数组中. ;作者:ONEPROBLEM;=================================================_BubblingSort proc _lpData,_dwCount,_dwOption local @dwCount pushad mov edi,1 .while edi < _dwCount mov e...
2008-10-12 07:42 | 阅读 12488 次 | 评论 0 条

代码优化的例子

两段代码,实现的功能是相同的,但代码的长度却有较大区别. 代码段一: mov edi, offset szText or ecx,0FFFFFFFFH xor eax, eax repne scas BYTE ptr es:[edi] not ecx dec ecx 代码段二: mov edi, offset szText or ...
2008-09-07 23:34 | 阅读 5693 次 | 评论 2 条

PE文件头逻辑结构

PE文件头逻辑结构
2008-08-26 22:48 | 阅读 6881 次 | 评论 1 条

利用单链表的头插入法,理解SEH的设置

在Win32汇编中,对于SEH异常处理回调函数的设置,只有3条简单的指令,但要真正理解起来,还真不容易. 指令如下: push offset _Handler ;回调函数地址入栈 push fs:[0] ;原先的EXCEPTION_REGISTRATION 结构地址入栈 mov fs:[0],esp ;把当前栈顶地址赋予fs:[0] 如果只看这3条指令是无法理解的,必须结合单链表的头插入法来理解它. 首先,可以把fs:[0] 当作头指针来看待;(注意:fs:[0]就是NT_TIB结构中ExceptionL...
2008-08-22 23:45 | 阅读 4598 次 | 评论 0 条

初学PE文件的一些总结

初学PE文件,总结一些经验。1、为什么在PE文件中有DOS文件头和DOS块? 因为,防止PE文件在DOS系统下执行。PE文件是在Windows系统下的可执行文件格式。如果在DOS系统下执行,就会显示一句:This program cannot be run in DOS mode .这句话是在DOS块中的。当然,你也可以在DOS块中安排一个16位汇编的程序,使得PE文件在DOS系统下也有一定的功能。 2、Windows装载器装载PE文件的第一步简要过程是怎样的? 首先,要读取文件头的前两个字节4D 5A,从而知道这是DOS文件头(标记是MZ);遍历DOS文件头的结构IMAG...
2008-08-14 16:56 | 阅读 7158 次 | 评论 1 条

看Intel手册很吃力

1. Opcode (operation code) :操作码 2. Instruction :指令 3. 64-Bit Mode :64位模式 4. compat/Leg mode :适用/支持 模式 ? 5. description :描述,说明 6. Valid :有效的 7. Invalid :无效的 8. r/m32 :寄存器或内存,32位(其它类推) 9. imm3...
2008-08-08 16:23 | 阅读 4645 次 | 评论 0 条

lodsb 和 stosb 指令

lodsb 指令:从esi 指向的源地址中逐一读取一个字符,送入AL 中; (然后,可以先判断这个字符是什么字符,如0dh,0ah 之类等,再执行相应的操作); stosb 指令:一般跟随在lodsb 指令后面,将AL 中的字符逐一写入edi 指向的目的地址; 如果是lobsw ,表明要处理的是字,而不是字符;则采用的相应指令是:stosw ;那么要判断的寄存器是AX,而不是AL 了. 如果是lobsd ,表明要处理的是双字;则采用的相应指令是: stosd ;这时候,要判断的寄存器就是EAX 了.
2008-08-02 17:46 | 阅读 18892 次 | 评论 2 条

今天认识了两个函数(lstrcpy,lstrcat)

好久不摸C语言了。 所以,在学习WIN32汇编的时候,不小心被两个函数给唬住了:lstrcpy ,lstrcat 在排毒(BAIDU)上搜了一下,才知道它们的原形竟然在C语言里! strcpy 原形:char *strcpy(char *str1,char *str2) 功能:将str2字符串复制到str1中; strcat 原形:char *strcat(char *str1,char *str2) 功能:把字符串str2连接到str1后面,原“\0”被取消。 返回值都是:str1 .
2008-08-01 17:53 | 阅读 8093 次 | 评论 0 条

关于进制的表示问题(牛哥牛弟别看了,会笑掉大牙的!)

有WIN32汇编中,如果要表示的是16进制的数据,则在其后面加H字母;如果要表示的是2进制的数据,则在其后面加B字母;如果要表示的是10进制的数据,则在其后面什么也不加.示例:mov eax,10h ;这里10进制是16mov edx,10 ;这里10进制是10mov ebx,10000b ;这里10进制是10
2008-07-24 22:57 | 阅读 3272 次 | 评论 1 条

演示双重循环(牛哥牛弟不要笑我菜啊)

;用WIN32汇编演示双重循环的用法(也可把内循环做成子程序,用外循环去CALL);从2个红球,3个白球,4个黑球中任意取出5个球,且其中必须有白球,有几种可能的组合情况?;============================================================================ .386 .model flat,stdcall option casemap:none include windows.incinclude user32.incinclude kernel32.incinc...
2008-07-24 22:54 | 阅读 3653 次 | 评论 0 条

2、关于如何计算局部变量的大小问题

经常反汇编的话,在调用子程序开始的地方,都会看到:push ebpmov ebp,espadd esp,FFFFFFF8 ;也可能是其它的值... ... 这种情况的指令形式。编译器采用的是“+”的方法来开辟局部变量的空间的。其实,我们要知道FFFFFFF8真正的值的话,就得采用“补码取反加1”才知道它的“绝对值”,是8。有没有更加方便的方法呢?有!我们知道,正数+负数=0(前提是两者绝对值相等),所以,我们用“0-负数”的方法也可以得到“正数”,即“绝对值”。00000000-FFFFFFF8=800000000-FFFFFFAC=54当然,这种算法涉及到最后一位的借位问题,把这点...
2008-07-18 22:44 | 阅读 4803 次 | 评论 6 条

1、关于 wsprintf 函数

在学习Win32汇编的过程中,发现一个有趣的现象: 在使用wsprintf这个函数的时候,反汇编到调用这个函数的代码处,发现其后总是跟着这样的指令:add,esp,0000000c ,这里的0000000c (会随着参数的个数发生变化)其实就是12个字节,正好是传递给wsprintf函数的3个参数曾经使用的栈空间值.这条指令等于是把wsprintf的参数都扔掉了(主动清除堆栈)。这条指令是谁设的呢?编译器!
2008-07-18 22:17 | 阅读 7957 次 | 评论 3 条