1.1 上机建立第一个工程
一条指令可能有很多细节,比如第二个操作数和第一个操作数中,哪个只能是寄存器,哪个不能用寄存器加立即数等。如果要用手写汇编语言来开发一个软件的话,这些知识很重要。但是实际上,现在需要的是用C语言或者更高级的语言进行开发,只是需要理解一些没有C代码的部分。读者可以认为,那些代码的汇编指令用法一定是正确的,因为它们是编译器生成的。
1.2节(简要复习常用的汇编指令)将简要地回顾那些指令,并保证这些回顾非常容易理解。
1.1.1 用Visual Studio创建工程
建议读者的计算机中操作系统的版本最好是Windows XP或者更高的版本,使用Vista问题也不大,虽然可能操作细节和界面与本书描述的情况稍有不同。然后,请安装某个版本的Visual Studio,推荐Visual Studio 2003或者更高的版本。下面的描述同时顾及Visual Studio 2003和Visual Studio 2005的情况,语言版本为英文。
下面的步骤将在Visual Studio上建立一个用于实验的工程。有经验的读者可以忽略下面的描述。
(1) 打开Microsoft Visual Studio 2005,选择主菜单“File”。
(2)选择子菜单“New”下面的“Project”,打开“New Project”对话框。
(3)左边选择Visual C++,Win32;右边选择Win32 Console Application;下面输入一个工程名,然后单击“OK”按钮,出现向导。一切都选择默认设置,最后单击“Finish”按钮。
此时新建立工程的主文件是一个扩展名为.cpp的文件,请将它改为扩展名为.c的文件。
Windows底层代码基本上都是用C语言编写的,研究C语言和汇编指令的关系是本节的任务。为此,这个文件必须改变为扩展名为.c的文件,这样VC才会自动以C语言的方式进行编译。本书后面专门有一章的内容来研究C++下的反汇编阅读(第5章 用C++编写的内核程序)。
(4)如果读者使用的是Visual Studio 2005,直接在左边的Solution Explorer中用鼠标右键单击文件YourProjectName.cpp,选择“Rename”,然后把.cpp改为.c即可。
如果是更老的Visual Studio版本,请单击右键,Remove这个文件。然后在外面改名,再对工程单击右键,选择“Add”,再选择“Exist Item”,追加进来。
此时程序是这样的:
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
} |
1.1.2 用Visual Studio查看汇编代码
C语言程序对应的汇编代码,可以在VC中非常清楚地显示出对应关系。但是并不是所有的读者都知道如何调出汇编指令窗口。这个诀窍在下面描述。
VC必须处于调试状态才能看到汇编指令窗口。因此,请在return 0一句上设置一个断点:把光标移到那一行,然后按下F9键设置一个断点。
按下F5键调试程序。当程序停止在这一行的时候,打开菜单“Debug”下的“Windows”子菜单,选择“Disassembly”。这样,出现一个窗口,显示下面的信息:
--- f:\root\work\any\t12\t12\t12.c ————--
// t12.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
00411360 push ebp
00411361 mov ebp,esp
00411363 sub esp,0C0h
00411369 push ebx
0041136A push esi
0041136B push edi
0041136C lea edi,[ebp-0C0h]
00411372 mov ecx,30h
00411377 mov eax,0CCCCCCCCh
0041137C rep stos dword ptr es:[edi]
return 0;
0041137E xor eax,eax
}
00411380 pop edi
00411381 pop esi
00411382 pop ebx
00411383 mov esp,ebp
00411385 pop ebp
00411386 ret
|
如果上面的内容完全看不懂,也许读者需要复习一下汇编指令。以上的汇编指令数量非常的少,只需要了解push、mov、sub、lea、stos、xor、pop、ret,就可以继续本书的学习之旅了。所以请不用担心,接下来就会熟悉这些代码。
|
| 返回 |
| |
|