羅雲彬的彙編書籍确實比較入門,前面兩章把打下一些基礎、環境配置完畢,後面的内容輕松許多了!
“麻雀雖小,五髒俱全”,多經典的一句話!簡單的一個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彙程式設計式的結構。