说明:本系列内容不会详细讲解汇编的知识,只是记录我自己学习的一个过程,而且,我学习的目标不是打算写汇编,而是了解一点点win32汇编的知识,只是为了让自己能读懂最基本的汇编。另外,win32汇编的核心应该还是在windows API的学习,这个不是我的重点,可以认为我只是打算学习一下http://book.51cto.com/art/200907/133699.htm这本书的第三章的内容!:)
参考:http://www.cnblogs.com/BoyXiao/archive/2010/11/06/1870397.html
环境搭建:
首先就是环境搭建,由于我没打算专业去学汇编的东西(比如PE结构、win32汇编的基本语法(这部分有很多是和8086一样,所以不会在后面去分析)等什么的都不会去研究),所以,希望用一个简单点的方法让我能编译汇编就可以了。上面的参考链接是一个很好的文章,提供了几种搭建汇编环境的方法。
这里只提示一下:
参考文章中的”vs+masm“的方法,应该是可以改进的,因为vs中自带了masm程序,应该是不需要下载的,而且那个Irvine库应该也不是必须的。
所以,我将使用VS命令行下的自带汇编器来学习基本的入门的win32汇编。
下面以一个简单的例子了解VS自带的汇编器:
我们知道,vs的编译器是cl.exe、链接器是link.exe,既然vs自带了masm,那么是不是masm.exe,答案是否定的。vs的汇编器是ml.exe。其在64bit的命令行下是ml64.exe,不知道为何要换一个名字,cl.exe就没有换名字。
下面是一个”hello,world“的代码:
// test.c #include <stdio.h> int main() { printf("Hello, world\n"); return 0; }
VS2010的命令行(Visual Studio Command Prompt (2010))下编译:
cl test.c /FA /nologo
就会得到test.asm和test.obj和test.exe文件,删除test.obj和test.exe,得到hello,world的asm文件。
; Listing generated by Microsoft (R) Optimizing Compiler Version 16.00.30319.01 TITLE C:\tempLab\asm\test.c .686P .XMM include listing.inc .model flat INCLUDELIB LIBCMT INCLUDELIB OLDNAMES _DATA SEGMENT $SG2637 DB 'Hello, world', 0aH, 00H _DATA ENDS PUBLIC _main EXTRN _printf:PROC ; Function compile flags: /Odtp _TEXT SEGMENT _main PROC ; File c:\templab\asm\test.c ; Line 5 push ebp mov ebp, esp ; Line 6 push OFFSET $SG2637 call _printf add esp, 4 ; Line 7 xor eax, eax ; Line 8 pop ebp ret 0 _main ENDP _TEXT ENDS END
使用VS的汇编器(Assembler)编译上面的test.asm如下:
ml test.asm
生成test.obj和test.exe。
(说明:在VS的64bit命令行下进行上面的操作,居然调用ml64编译的时候汇编代码有错误,搞不懂。)