1. 程式人生 > >彙編教程8:hello world

彙編教程8:hello world

今天我就要帶大家走進彙編的”hello World“了,我個人覺得我寫的是比較慢的,講的有點細,寫了7篇了才寫到進入”hello World“,其實我本意是把主力放win32上的,所以我會加快進度了。

我可以想象你是絕對不會滿足於到debug上小試牛刀的,一定想做更多的事情,也許你會覺得我那麼晚都不推出寫個”hello World“而憤憤不已,那麼到現在我終於要勸你了,你應該平靜下來,我們現在就看看”hello World“,其實還不能夠算”hello world“只是一個最基本的彙編程式,連顯示”hello world“也不行,不過總算是把程式憋出來了。

首先寫程式嘛,你得有個編輯器,我個人推薦是IDE程式設計環境,我已經在

Radasm使用教程中說明了怎麼樣建立”hello World“了,如果你執意要選擇其他的程式設計環境、這也是可以的,比如“記事本”。但是“記事本”是不夠方便的,還是選擇Radasm吧。。我這裡就按照Radasm 環境講解了。

既然是寫彙編程式,那麼我們還是來看看別人的程式是怎麼寫的吧,剛開始學程式設計應該都是“照葫蘆畫瓢”吧,在彙編中,一個最簡單的程式應該是下面這幅模樣:

assume cs:code

code segment

start: mov ax, 0132H mov bx, 4522H add ax, 1 add bx, 4 mov ax, 4c00H int 21H

code ends

end start

彙編程式中包括指令和偽指令,偽指令是寫給編譯器看的,並沒有直接對應的機器碼,指令就相反。我們來慢慢講解,一行一行來,首先看看紅色的程式碼處,code segment ……code ends,這表示定義一個段code segment表示段的開始,code ends表示段的結束,你可能會問,為什麼我們要把程式碼放在段裡面呢?回憶我們前面給大家介紹段的概念,有了段我們才可以把程式碼,資料,棧,什麼的分段來進行存放,所以我們前面學的知識沒有白費吧,讓我猜猜你現在想什麼:一定是在感激我吧,@#¥¥#!

那麼知道了段的定義了,我現在再告訴你一個壞訊息,一個彙編程式中、你必須要有個段,所以你想省是不行的,前面的code是什麼意思呢?這個嘛,沒有意思的,你可以把它命名為ok或者什麼的,都沒有關係,隨便你自己喜歡。象高階語言裡面的變數命名。

藍色部分就是指令了,應該不需要解釋吧,應該都認識這幾條指令的。

那麼assume cs:code是什麼呢?assume cs:code表示把CS暫存器和code段關聯起來,assumen這條指令講起來比較麻煩,在我們以後用的的時候再講,只要記得加上那麼一條指令就成。

綠色的指令是做什麼的呢?簡單說和高階語言裡面的return是差不多的,表示返回成功,這樣程式才可以退出,程式才可以把shell返回給dos系統,系統才可以去做其他的事情。現在只要記得在程式碼寫完的時候加上這麼一條就成,告訴下作業系統,“我返回成功了”。

start……end start是什麼意思呢?我們知道在高階語言裡面都是寫程式都不用我們指定,從什麼地方開始執行,但是彙編不同,編譯器不知道你的程式碼要從什麼地方開始執行,所以這條語句就是告訴編譯器,我的程式在什麼地方開始執行。這裡是start處,也就是執行mov ax, 0132H指令。

那麼程式是已經分析完了,我們來試試怎麼樣自己寫呢?首先我們要有個段,我們給它取名為x,那麼就是x segment…….x ends,中間就是我們要實現的指令了,你可以隨便寫幾條,比如計算2+2+2、那麼就是:

x segment

mov ax, 2 add ax, 2 add ax, 2

x  ends

又以為x是程式碼段,所以我們把x段和CS關聯起來,那麼就又多了句 assume cs : x,然後我們還要指定指令的開始執行處,所以程式碼就成了這樣了

assume cs : x

x segment

start: mov ax, 2 add ax, 2 add ax, 2

x  ends end start

還沒有完呢!我們的程式碼執行完後要返回給作業系統,所以要再加兩句程式碼mov ax, 4c00h int 21h.到這裡就已經把一個最小的彙編程式實現起來了,我們來看看長什麼樣子?

assume cs : x

x segment

start: mov ax, 2 add ax, 2 add ax, 2

mov ax, 4c00H int 21H

x  ends end start

本來想找個WP外掛顯示下程式碼的,可是沒有找到ASM語言的外掛啊,所以…..

這就是一個最基本的彙編程式了,應該說不能夠再少了。編譯和執行方法已經在彙編教程7:RadAsm使用教程中說明了,把程式執行起來吧。……怎麼什麼也沒有???

呵呵..這個程式什麼也還沒有做呢,當然什麼也沒有做,我們只是修改了幾個暫存器的值而已。那麼這個到底算不算是程式呢??實際上是算的,不信我們用debug除錯下,開啟CMD切換到你編譯好程式的目錄,如果你用的和我一樣是Radasm、並且也是cao_cong漢化的版本的話預設目錄應該在C:\RadASM\Masm\Projects,然後進入你的建立的專案名稱目錄中輸入命令debug 專案名稱.exe 然後debug就裝載了你那個exe檔案。。

首先輸入-R命令看看各暫存器的值,注意看了,這裡AX的值是0,然後我們再看看其他的指令:

我們接著看看U命令,命令執行後,我們程式碼的3條指令確實是在的那麼我們用T命令執行

這是我執行了3次T命令後的結果

仔細看AX的值,和我們預料中的是一樣的,那麼應該可以說我們這個程式是合格的,那麼最基本的程式就算寫出來了,最後我還要說明的一點就是,當執行到指令int21的時候就不能夠用-T了,要改為-P,至於為什麼現在我們還不用瞭解。到時候就明白了。那麼玩夠了就可以-Q退出debug

那麼這篇也就算寫完了,本來我不想上傳那麼多圖片的,大家都學彙編的人了應該這點常識我覺得還是有的,可是想了下、我的表達能力不是很好所以,還是上傳點圖片吧,反正也不管別人說是傻瓜教程了,這篇結束後,你應該好好在下面練習下我們講過的’棧’,多練習下debug,沒事寫幾條指令執行下,一定要多寫多練。