剛才我已經寫了一篇radasm使用教程,為的就是讓大家學起來不會遇到一點困難,不要讓大家在玩第乙個」hello world「就宕機了,打擊了興趣、那就麻煩了!
我可以想象你是絕對不會滿足於到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,沒事寫幾條指令執行下,一定要多寫多練。
彙編helloworld程式
data segment 定義資料段 output db hello world 定義乙個字串,記得要以 為結束標誌 data ends 資料段結束 code segment 段定義開始 assume ds data,cs code start mov ax,data 實現段位址datas載入到ds...
mips彙編列印 hello world
mips組合語言列印 hello world 字串。已在pcspim下編印通過 print hello world programed by stevie zou text segment text globl main main la a0,str a0儲存要列印字元的位址 li v0,4 為sy...
linux 彙編 hello world 除錯
section data 初始化的變數 output ascii hello,world n 要列印的字串,data為初始化值的變數。output是標籤,指示字串開始的位置,ascii為資料型別 section bss 未初始化的變數,由0填充的緩衝區 lcomm num,20 lcomm為本地記憶...