标签:
学习研究系统/软件底层机制的朋友,汇编是必修课之一。由于汇编具有低级语言固有的特性,使得前期的学习掌握异常困难。本文将着重介绍一些常用而又关键的汇编指令,借此提携那些还在苦苦攀援的“初学者”们。
目前市场上主流的汇编教材中,王爽所著的《汇编语言(第二版)》比较受读者的青睐。笔者自学汇编所选的汇编教材则是杨继文所著的《80x86汇编语言程序设计教程》和《汇编语言程序设计——从DOS到Windows》张雪兰/谭毓安;根据书的厚度就可知其难易程度。读者若初次接触汇编,可以考虑以上三本经典教材,有一定基础的可以考虑罗云彬的Win32汇编……
学汇编,主要还是看你的用途。这一点请初学者谨记!汇编语言的难度是业内公认的,你完全没必要把整本书看完吃透才去接触逆向、破解等。我的建议是“选择性学习”:需要汇编进行编程开发的朋友,自然要按照书中安排的目录顺序按部就班的学习,但不要贪多(一本足矣!其余的靠www.baidu.com就行了);目标是软件调试、加解密、恶意代码分析的朋友,建议只看“前三章”(随后根据需要选择阅读),大体上应该是三部分的内容:
①【微处理器的基本介绍/汇编的数据类型(包括进位制转换与运算)】
②【寻址方式/指令集/寄存器】
③【汇编编程的基本元素(类似于C中的表达式、语句、控制结构部分)】
学以致用!不要单纯地为了汇编而去学汇编,务必明确目标是什么!学习的过程中,强调亲自上机调试(而不是死扣图片和文字),才能理解深刻。
根据自身的学习能力,合理安排学习时间。遇到难点善于网络搜索,要能够达到“不会作诗也会吟”的程度。
**********************************************************************************
我简要总结了指令集部分:
图1:
可以明确告诉大家,一百多条指令不需要全部记忆(也绝对不是像背单词一样的记!),我甄选了一小部分,是务必要掌握的:
MOV/LEA/XCHG ;传送/传送EA/交换
PUSH/POP ;入栈/出栈
CALL/RETN ;过程调用/返回
ADD/SUB/INC/DEC ;加减运算/加1/减1
JMP/JE…… ;无条件转移/条件转移
CMP ;比较
INT ;中断
XOR ;异或(相同为0,不同为1,用于寄存器清零)
(另外需要注意,AX是16位寄存器,相应的32位版本则是EAX……)
接下来上图,带大家与汇编指令亲密接触。
VC6.0 图2:
VC6.0 Debug:图3
OllyDBG:图4
图示为main函数的反汇编代码
Ollydbg给的信息比VC更详细。
相信大家都能毫不费力看懂C代码,但是反汇编之后呢?做逆向,往往都不会接触源代码,面对的则是一个“黑箱”,这就需要拿出反汇编的利器(IDA、W32Dasm等)进行静态分析。
每一条指令我都添加了注释(右边),请您配合C代码逐条分析。分析的程序功能不同,则相应的指令也会不同;
main的反汇编结构如图5:
:
End.
2015/12/9.Wednesday
YPP.
标签:
原文地址:http://www.cnblogs.com/yppshell/p/5033774.html