现在的位置: 首页 > 综合 > 正文

win32汇编入门了解(1)环境搭建

2013年07月20日 ⁄ 综合 ⁄ 共 1453字 ⁄ 字号 评论关闭

说明:本系列内容不会详细讲解汇编的知识,只是记录我自己学习的一个过程,而且,我学习的目标不是打算写汇编,而是了解一点点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编译的时候汇编代码有错误,搞不懂。)

抱歉!评论已关闭.