新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 關(guān)于DOS匯編學(xué)習(xí)的一些經(jīng)驗(yàn)

        關(guān)于DOS匯編學(xué)習(xí)的一些經(jīng)驗(yàn)

        作者: 時間:2012-08-10 來源:網(wǎng)絡(luò) 收藏

        我吧一些學(xué)習(xí)心得寫在這里,希望 能給于志同道合的人一點(diǎn)幫助,同時也記錄下自己點(diǎn)點(diǎn)滴滴。

        首先要有個開發(fā)環(huán)境。下個MASM6.1X 與MASN5.0 幾百K吧。平常用到了是MASM LINK ML DEBUG 。

        我簡單介紹下MASM 匯編編譯器,吧匯編代碼編譯成2進(jìn)制目標(biāo)代碼

        LINK 模塊連接器
        ML是一種自動調(diào)用MASM與LINK的程序
        DEBUG 調(diào)試用的

        我簡單寫個匯編代碼 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 ;結(jié)束
        INT 21H
        CODE ENDS
        END START

        用MASM aa.asm 編譯成模塊 aa.obj 然后用link aa.obj
        這時會報錯 error LNK1123: failure during conversion to COFF: file invalid or corrupt
        這我 查了資料下面是原話:

        Windows平臺下,源代碼編譯出來的obj主要有兩種格式:OMF和COFF,其中,OMF格式是原來IBM(好像是吧,不記得了)使用的格式,而COFF格式則是從微軟從UNIX移植過來的,因?yàn)槲④浌鹃_發(fā)Windows的軟件工程師大多對UNIX很熟,所以自然而然的采用了類似UNIX COFF的這種Win32 COFF格式(和UNIX的"純種"COFF是有區(qū)別的,但仍然叫COFF格式)

        這個也差點(diǎn)讓我斷下接下去的路。 解決辦法就是弄個16位的連接器, 這里MASN5.0就起做用了,你最好是吧里面link.exe改成link16.exe

        然后link16 aa.obj這樣就編譯成exe文件了,然后在DOS中直接aa.exe就可以看到結(jié)果了。

        可能我省略了一些細(xì)節(jié)問題。就是打開DOS打MASM沒反應(yīng),那么這既是你沒設(shè)置環(huán)境變量得關(guān)系。如果你學(xué)過JAVA就應(yīng)該知道,在系統(tǒng)設(shè)置 --環(huán)境變量中 --PATH 在里面加上你這些工具的目錄就行,或者在DOS理直接設(shè)置set PATH= MASM所在的路徑,這個在DOS退出設(shè)置就會沒了。 至于為什么這么做,我簡單說下,程序是死的,你必須讓電腦知道你的MASM工具在哪,dos默認(rèn)是在PATH系統(tǒng)環(huán)境變量中去尋找你敲的,你一旦設(shè)置了,那么久直接啟動MASM,那么你可以敲命令了。

        還有個你編譯匯編文件時,你得確保DOS所在目錄在你源碼文件目錄里,我的CMD默認(rèn)C:Documents and SettingsOwner>如果我直接masm c:testaa.asm那么生成的aa.obj就在C:Documents and SettingsOwner里,為了防止這個,就必須 cd c:test 進(jìn)入
        然后顯示c:test> 這是你輸入masm aa.asm 那么aa.obj就在aa.asm在同個目錄了。這些就是新手不了解的,因?yàn)槲以?jīng)搞過一段時間的JAVA但是也折騰了很長時間才找到的。
        環(huán)境好了后,就可以開始學(xué)習(xí)了。
        學(xué)習(xí)的時候,可能你和我一樣會看到 有些代碼
        .modle small
        .data
        .code
        .startup
        |
        .exit 0
        end
        其實(shí)這個和上面同時匯編,只是寫的模式不一樣。 所以不用懷疑再到處找資料,我也是看完才知道的,因?yàn)橛衛(wèi)inux匯編,我還以為有幾種匯編,所以才有2中不同模式。

        匯編的學(xué)習(xí),其實(shí)沒有想象中的那么復(fù)雜,關(guān)鍵是理解。 記住每個的作用。 還有看不懂原理的時候也要多次看加深印象。 像內(nèi)存的分配圖和程序怎么裝載的。這些雖然不影響程序的編寫,但是對于理解操作系統(tǒng)的運(yùn)轉(zhuǎn)是很重要的。 常常我們?yōu)樘嗟膮R編指令而頭疼,其實(shí)沒必要記,學(xué)會查,下個匯編指令手冊,一遍看程序一遍查,用多了就記住了。 匯編他有自己的格式,我們寫的時候必須要規(guī)范。

        比如匯編開始的時候都會有mov ax, data mov ds,ax 首先DS是指存放數(shù)據(jù),然后你就知道這步其實(shí)是告訴程序數(shù)據(jù)的地址。但是沒看到其他的地址,那么你查資料就會知道 其他的可以不用寫。因?yàn)?stack 有個segment stack 已經(jīng)定位好了堆棧,至于代碼的地址,如果看程序如何裝載到內(nèi)存中的,那么你就知道這個是系統(tǒng)來設(shè)置的,不用我們再手動去定位了。 學(xué)習(xí)的時候如果你不知道寫什么,那么你多看看上面的例子,例子看完了,自己就脫離這些例子來寫,多練掌握很快的。

        當(dāng)匯編有一定基礎(chǔ),你就可以開始進(jìn)行了,所謂就是利用匯編基本語法來進(jìn)行DOS程序的編寫。這個或許剛學(xué)的人搞不透,其實(shí)很簡單的。首先你要有BIOS中斷手冊,上面的int 21h什么的都是中斷,至于什么意思,你查手冊。你想做什么功能呀是到手冊上找相應(yīng)的中斷提供和一些數(shù)據(jù)的怎么在寄存器上定義的。 然后多寫寫就可以了。 我有一篇就講了下這其中是怎么實(shí)現(xiàn)的。

        到此我吧一些心得寫完了,至于具體的看個人。



        關(guān)鍵詞: DOS匯編 寄存器 段地址

        評論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 长顺县| 榆中县| 太仓市| 河西区| 固原市| 古丈县| 清原| 杭锦后旗| 秦皇岛市| 泸溪县| 乐至县| 吉木乃县| 锡林浩特市| 甘谷县| 滦南县| 霍林郭勒市| 弋阳县| 丰县| 巴林右旗| 泰兴市| 张家港市| 吉林省| 大同市| 林周县| 五莲县| 吴江市| 乌什县| 新宁县| 新巴尔虎右旗| 天津市| 慈利县| 河津市| 新田县| 邢台县| 庆云县| 丹棱县| 吉木乃县| 绥芬河市| 冷水江市| 裕民县| 吐鲁番市|