代码优化的例子

两段代码,实现的功能是相同的,但代码的长度却有较大区别. 代码段一: 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文件头逻辑结构

PE文件头逻辑结构

学编程的最绝妙方法与最高境界

[转自百度百科] 1988年王江民接触计算机开始于工控。王江民意识到要搞光机电自动化,必须依靠计算机来控制,不学计算机肯定会落后。“我38岁开始学计算机,没有感觉我老了,没有感觉我不行,只感到我的英语基础不好。再说,计算机是实践性非常强的学科。我搞计算机是用计算机,不是学计算机。”
小知识 | 2008-08-24 22:59 | 阅读 5145 次 | 评论 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...

初学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...

看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...

菜鸟碎说指针

刚学习指针的时候,不知道它是什么;老是和其它的数据区别不出来~~ 过了好久,才知道,指针就是个地址而已~~ 现在看来,指针不只是个地址了~~ 指针啊~~你真的是无时不在、无处不有啊~~ EIP ,是指令指针寄存器;指令不是不等长的吗?EIP怎么知道每执行完一条指令就要增加(减少)多少字节呢? 呵呵~~我想,指令的长度一定是固定的,而每条指令读或写的数据长度也应该是有规定的~~比如,根据寄存器确定数据长度;要是没有寄存器参与,就要WORD PTR 或DWORD PTR 了~~ 在处理字符串中,常用某个变量或寄存器来记录 字符个数 ,其实它也算个指针...
小知识 | 2008-08-05 09:07 | 阅读 4572 次 | 评论 4 条

lodsb 和 stosb 指令

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

今天认识了两个函数(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 .

删除键(BackSpace)的一个作用

偶是个电脑业余爱好者,没有经过正规的学习.所以偶然发现一些小技巧就比较高兴. 以前我只是知道"删除键(BACKSPACE)"有删除字符的作用. 没想到它还能"后退": 即,我们在浏览网页的时候,如果要退回上一页,往往用鼠标去点击工具栏上的"后退"按钮,其实也可以按"删除键(BACKSPACE)"达到这个效果.还有,我们在打开文件夹的时候,往往也点击"向上翻"来退回上一个目录,现在也可以用"删除键(BACKSPACE)"代替的.
小知识 | 2008-07-31 12:56 | 阅读 4334 次 | 评论 0 条

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

有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...

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

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

1、关于 wsprintf 函数

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