我在学习汇编的时候,往往在读别人的程序,或者是在认识了新API函数的时候,不清楚这个函数在那个头文件和导入库中,于是,就写了个小程序.
程序记录如下:
;=========API函数头文件查询器====================;程序功能:给定函数名称,查找该函数在D:\masm32\INCLUDE;目录中所在的头文件.返回头文件名称.;使用编译器:MASMPlus;作者:ONEPROBLEM QQ:962361395;时期:2009年02月07日;================================================ .386 .model f...
1.GetCursorPos函数只有一个参数:lpPoint ;
lpPoint指向一个POINT结构
POINT STRUCT
x DWORD ?
y DWORD ?
POINT ENDS
(x,y)坐标是以整个屏幕为参照的,而不是某个应用程序窗口的客户区为参照;
2.应用程序的窗口标题栏的高度大概是38像素.
有些朋友在学习罗云彬的<Windows环境下32位汇编语言程序设计>一书第五章的时候,对Menu 例子程序中的关于全局变量与局部变量的用法有些疑惑.
如,在Menu 例子程序中,hSubMenu 这个子菜单句柄变量,如果放在了局部变量中(即窗口过程中),程序正常,却没有弹出菜单;而改为放在全局变量中,才弹出菜单.
为什么?
我在学习该书第五章的"使用图标和光标"内容的时候,也遇到了类似的问题:如果,把hIconBig,hIconSmall,hCur1,hCur2 这几个句柄变量都设为局部变量,则程序虽然编译通过且运行了,但所加载的图标和光标都没有起作...
;调用冒泡排序函数的例子程序;作者: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 ...
;用汇编实现冒泡排序的函数;参数说明:_lpData是待排序的数组首地址,_dwCount是待排序的个数,_dwOption设为0则由小到大排序;如果是非0值,则是由大到小排序.;返回值:已排序数据放回原数组中.
;作者:ONEPROBLEM;=================================================_BubblingSort proc _lpData,_dwCount,_dwOption local @dwCount pushad mov edi,1 .while edi < _dwCount mov e...
两段代码,实现的功能是相同的,但代码的长度却有较大区别.
代码段一:
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 ...
PE文件头逻辑结构
在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...
初学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...
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...
lodsb 指令:从esi 指向的源地址中逐一读取一个字符,送入AL 中; (然后,可以先判断这个字符是什么字符,如0dh,0ah 之类等,再执行相应的操作);
stosb 指令:一般跟随在lodsb 指令后面,将AL 中的字符逐一写入edi 指向的目的地址;
如果是lobsw ,表明要处理的是字,而不是字符;则采用的相应指令是:stosw ;那么要判断的寄存器是AX,而不是AL 了.
如果是lobsd ,表明要处理的是双字;则采用的相应指令是: stosd ;这时候,要判断的寄存器就是EAX 了.
好久不摸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 .
有WIN32汇编中,如果要表示的是16进制的数据,则在其后面加H字母;如果要表示的是2进制的数据,则在其后面加B字母;如果要表示的是10进制的数据,则在其后面什么也不加.示例:mov eax,10h ;这里10进制是16mov edx,10 ;这里10进制是10mov ebx,10000b ;这里10进制是10
;用WIN32汇编演示双重循环的用法(也可把内循环做成子程序,用外循环去CALL);从2个红球,3个白球,4个黑球中任意取出5个球,且其中必须有白球,有几种可能的组合情况?;============================================================================ .386 .model flat,stdcall option casemap:none
include windows.incinclude user32.incinclude kernel32.incinc...
经常反汇编的话,在调用子程序开始的地方,都会看到:push ebpmov ebp,espadd esp,FFFFFFF8 ;也可能是其它的值... ...
这种情况的指令形式。编译器采用的是“+”的方法来开辟局部变量的空间的。其实,我们要知道FFFFFFF8真正的值的话,就得采用“补码取反加1”才知道它的“绝对值”,是8。有没有更加方便的方法呢?有!我们知道,正数+负数=0(前提是两者绝对值相等),所以,我们用“0-负数”的方法也可以得到“正数”,即“绝对值”。00000000-FFFFFFF8=800000000-FFFFFFAC=54当然,这种算法涉及到最后一位的借位问题,把这点...
在学习Win32汇编的过程中,发现一个有趣的现象: 在使用wsprintf这个函数的时候,反汇编到调用这个函数的代码处,发现其后总是跟着这样的指令:add,esp,0000000c ,这里的0000000c (会随着参数的个数发生变化)其实就是12个字节,正好是传递给wsprintf函数的3个参数曾经使用的栈空间值.这条指令等于是把wsprintf的参数都扔掉了(主动清除堆栈)。这条指令是谁设的呢?编译器!