天天看点

Win32汇编源程序的结构(1)

      罗云彬的汇编书籍确实比较入门,前面两章把打下一些基础、环境配置完毕,后面的内容轻松许多了!

      “麻雀虽小,五脏俱全”,多经典的一句话!简单的一个Hello World来很清楚的说明了Win32汇编程序的框架。

1、 Win32汇编源程序的结构

任何种类的语言,总是有基本的源程序结构规范,在讨论C语言的书中,大家都会记得这个非常经典的Hello World程序:

#include <stdio.h>

int main()

{

printf("Hello,world!/n");

return 0;

}

像这样一个程序,就说明了C语言中最基本的格式,main()中的括号和下面的花括号说明了一个函数的定义方法,printf语句说明了一个函数的调用方法,调用函数语句后面的分号也是基本的格式。C是一种高级语言,在C源程序中,不必为堆栈段、数据段和代码段的定义而担心,编译器会把程序中的字符串和语句代码分别放到它们该去的地方,程序开始执行的时候也会自己找到main()函数。而汇编是低级语言,必须为所有的东西找到它们该去的地方,所以在DOS的汇编中,Hello World又长成了这样一副模样:

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; 堆栈段

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

stack              segment stack

                   db        100 dup (?)

stack              ends

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; 数据段

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

data               segment

szHello            db        'Hello, world',0dh,0ah,'$'

data               ends

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; 代码段

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

code               segment

                   assume    cs:code,ds:data,ss:stack

start:

                   mov       ax,data

                   mov       ds,ax

                   mov       ah,9

                   mov       dx,offset szHello

                   int       21h

                   mov       ah,4ch

                   int       21h

code               ends

                   end       start

在这个源程序中,stack段为堆栈找了个家,hello world字符串则跑到数据段中去了,代码则放在代码段中,程序的开始语句必须由最后一句end start来说明应该从start这个标号开始执行,整个程序在使用过DOS汇编的程序员眼里是非常的熟悉。

到了Win32汇编的时候,程序的基本结构还是如此,先来看一看这个看起来很新鲜的Win32的Hello world程序:

    怎么样,看来和上面的C以及DOS汇编又不同了吧!但从include,.data和.code等语句“顾名思义”也能看出一点苗头来,include应该就是包含别的文件,.data想必是数据段,.code应该就是代码段了吧!接下来通过这个例了程序逐段介绍Win32汇编程序的结构。

继续阅读