關(guān)于DOS匯編學(xué)習的一些經(jīng)驗
我吧一些學(xué)習心得寫(xiě)在這里,希望 能給于志同道合的人一點(diǎn)幫助,同時(shí)也記錄下自己點(diǎn)點(diǎn)滴滴。
首先要有個(gè)開(kāi)發(fā)環(huán)境。下個(gè)MASM6.1X 與MASN5.0 幾百K吧。平常用到了是MASM LINK ML DEBUG 。
我簡(jiǎn)單介紹下MASM 匯編編譯器,吧匯編代碼編譯成2進(jìn)制目標代碼
LINK 模塊連接器
ML是一種自動(dòng)調用MASM與LINK的程序
DEBUG 調試用的
我簡(jiǎn)單寫(xiě)個(gè)匯編代碼 aa.asm
DATA SEGMENT
AA DB 'WWWWWWWW','$'
DATA ENDS
CODE SEGMENT 'CODE'
ASSUME CS:CODE ,DS:DATA
START:
MOV AX,DATA
MOV DS,AX ;代碼段的地址
LEA AX, AA
MOV DS ,AX
INT 21H
MOV AX,4C00H ;結束
INT 21H
CODE ENDS
END START
用MASM aa.asm 編譯成模塊 aa.obj 然后用link aa.obj
這時(shí)會(huì )報錯 error LNK1123: failure during conversion to COFF: file invalid or corrupt
這我 查了資料下面是原話(huà):
Windows平臺下,源代碼編譯出來(lái)的obj主要有兩種格式:OMF和COFF,其中,OMF格式是原來(lái)IBM(好像是吧,不記得了)使用的格式,而COFF格式則是從微軟從UNIX移植過(guò)來(lái)的,因為微軟公司開(kāi)發(fā)Windows的軟件工程師大多對UNIX很熟,所以自然而然的采用了類(lèi)似UNIX COFF的這種Win32 COFF格式(和UNIX的"純種"COFF是有區別的,但仍然叫COFF格式)
這個(gè)也差點(diǎn)讓我斷下接下去的路。 解決辦法就是弄個(gè)16位的連接器, 這里MASN5.0就起做用了,你最好是吧里面link.exe改成link16.exe
然后link16 aa.obj這樣就編譯成exe文件了,然后在DOS中直接aa.exe就可以看到結果了。
可能我省略了一些細節問(wèn)題。就是打開(kāi)DOS打MASM沒(méi)反應,那么這既是你沒(méi)設置環(huán)境變量得關(guān)系。如果你學(xué)過(guò)JAVA就應該知道,在系統設置 --環(huán)境變量中 --PATH 在里面加上你這些工具的目錄就行,或者在DOS理直接設置set PATH= MASM所在的路徑,這個(gè)在DOS退出設置就會(huì )沒(méi)了。 至于為什么這么做,我簡(jiǎn)單說(shuō)下,程序是死的,你必須讓電腦知道你的MASM工具在哪,dos默認是在PATH系統環(huán)境變量中去尋找你敲的,你一旦設置了,那么久直接啟動(dòng)MASM,那么你可以敲命令了。
還有個(gè)你編譯匯編文件時(shí),你得確保DOS所在目錄在你源碼文件目錄里,我的CMD默認C:Documents and SettingsOwner>如果我直接masm c:testaa.asm那么生成的aa.obj就在C:Documents and SettingsOwner里,為了防止這個(gè),就必須 cd c:test 進(jìn)入
然后顯示c:test> 這是你輸入masm aa.asm 那么aa.obj就在aa.asm在同個(gè)目錄了。這些就是新手不了解的,因為我曾經(jīng)搞過(guò)一段時(shí)間的JAVA但是也折騰了很長(cháng)時(shí)間才找到的。
環(huán)境好了后,就可以開(kāi)始學(xué)習了。
學(xué)習的時(shí)候,可能你和我一樣會(huì )看到 有些代碼
.modle small
.data
.code
.startup
|
.exit 0
end
其實(shí)這個(gè)和上面同時(shí)匯編,只是寫(xiě)的模式不一樣。 所以不用懷疑再到處找資料,我也是看完才知道的,因為有linux匯編,我還以為有幾種匯編,所以才有2中不同模式。
匯編的學(xué)習,其實(shí)沒(méi)有想象中的那么復雜,關(guān)鍵是理解。 記住每個(gè)寄存器的作用。 還有看不懂原理的時(shí)候也要多次看加深印象。 像內存的分配圖和程序怎么裝載的。這些雖然不影響程序的編寫(xiě),但是對于理解操作系統的運轉是很重要的。 常常我們?yōu)樘嗟膮R編指令而頭疼,其實(shí)沒(méi)必要記,學(xué)會(huì )查,下個(gè)匯編指令手冊,一遍看程序一遍查,用多了就記住了。 匯編他有自己的格式,我們寫(xiě)的時(shí)候必須要規范。
比如匯編開(kāi)始的時(shí)候都會(huì )有mov ax, data mov ds,ax 首先DS是指存放數據寄存器的段地址的寄存器,然后你就知道這步其實(shí)是告訴程序數據的地址。但是沒(méi)看到其他的地址,那么你查資料就會(huì )知道 其他的可以不用寫(xiě)。因為 stack 有個(gè)segment stack 已經(jīng)定位好了堆棧,至于代碼的地址,如果看程序如何裝載到內存中的,那么你就知道這個(gè)是系統來(lái)設置的,不用我們再手動(dòng)去定位了。 學(xué)習的時(shí)候如果你不知道寫(xiě)什么,那么你多看看上面的例子,例子看完了,自己就脫離這些例子來(lái)寫(xiě),多練掌握很快的。
當匯編有一定基礎,你就可以開(kāi)始進(jìn)行DOS匯編了,所謂DOS匯編就是利用匯編基本語(yǔ)法來(lái)進(jìn)行DOS程序的編寫(xiě)。這個(gè)或許剛學(xué)的人搞不透,其實(shí)很簡(jiǎn)單的。首先你要有BIOS中斷手冊,上面的int 21h什么的都是中斷,至于什么意思,你查手冊。你想做什么功能呀是到手冊上找相應的中斷提供和一些數據的怎么在寄存器上定義的。 然后多寫(xiě)寫(xiě)就可以了。 我有一篇就講了下這其中是怎么實(shí)現的。
到此我吧一些心得寫(xiě)完了,至于具體的看個(gè)人。
評論