第一个程序---汇编学习笔记
第四章 第一個程序
4.1 一個源程序從寫出到執行的過程
一個匯編語言程序從寫到最終執行的簡要過程。
如圖所示:
4.2 源程序
程序代碼如下:
;assume是假設 assume cs:codesg;偽指令 ;段名 segment codesg segmentmov ax,0123Hmov bx,0456Hadd ax,bxadd ax,ax;程序返回,沒有下面2句,程序發生邏輯錯誤mov ax,4c00Hint 21Hcodesg ends ;段名 endsend ;end是匯編程序的結束標記以上代碼相關說明:
編譯連接后:
4.3 編輯源程序
過程:
4.4 編譯
**編譯**T1.asm文件,如圖:
一般來說,有兩類錯誤使我們得不到所期望的目標文件:
在編譯過程中,我們提供一個輸入:T1。最多可以的到三個輸出:目標文件(.obj)、目標文件(.lst)、交叉引用文件(.crf)。目標文件使我們最終得到的結果,而另外兩個只是中間結果,可以讓編譯器忽略對它們的生成。
4.5 連接
**連接**T1.obj文件,如圖:
這個程序中有一個警告錯誤:“沒有棧段”,這里我們不理會這個錯誤。
第一個是輸入:目標文件。輸出是:可執行文件名、映像文件的生成、庫文件的連接。
連接的作用:
4.6 以簡化的方式進行編譯和連接
如圖,在命令行的結尾加上分號。
4.7 T1.exe的執行
運行后沒有任何結果,這很正常!因為我們是對寄存器做操作,并不是顯示到屏幕上。
4.8 誰將可執行文件中的程序轉載進入內存并使它運行?
按照上面原理,我們來看一下4.7節中的T1.exe的執行過程(思考相關的問題)。
問題 4.1
此時,有一個正在運行的程序將 T1.exe 中的程序加載入內存,這個正在運行的程序是什么?它將程序加載入內存后,如何使程序得以運行?
問題 4.2
程序運行結束后,返回到哪里?
我們來了解一下操作系統的外殼。
操作系統是一個由多個功能模塊組成的龐大、復雜的軟件系統。任何通用的操作系統,都要提供一個稱為 shell(外殼)的程序,用戶(操作人員)使用這個程序來操作計算機系統進行工作。DOS中有一個程序command.com,在這個程序在DOS中稱為命令解釋器,也就是DOS系統的shell。DOS啟動時,先完成其他重要的初始化工作,然后運行 command.com,command.com運行后,執行完 其他的相關任務后,在屏幕上顯示出由當前盤符和當前路徑組成的提示符,比如:“c:\”或“c:\windows”等, 然后等待用戶的輸入。用戶可以輸入所要執行的命令,比如,cd、dir、type等,這些命令由command執行,command執行完 這些命令后,再次顯示由當前盤符和當前路徑組成的提示符,等待用戶的輸入。如果用戶要執行一個程序,則輸入該程序的可執行文件的名稱,command首先根據文件名找到可執行文件, 然后將這個可執行文件中的程序加載入內存,設置CS:IP指向程序的入口。此后,command暫停運行,CPU運行 程序。程序運行結束后,返回到command中,command再次顯示當前盤符和當前路徑組成的提示符,等待用戶的 輸入。在DOS中,command處理各種輸入:命令或要執行的程序的文件名。我們就是通過command來進行工作的。現在來回答問題4.1和4.2中所提到的問題。
(1) 在DOS中直接執行T1.exe時,是正在運行的command,將T1.exe中的程序加載入內存;
(2) command設置CPU的CS:IP指向程序的第一條指令(即程序的入口)。從而使程序得以運行;
(3) 程序運行結束后,返回command中,CPU繼續運行command。
4.9 程序執行過程的跟蹤
在編寫程序的時候,常常會出現我們的語法沒有錯誤,而邏輯出現錯誤。這個時候我們就需要拿起強有力的工具,就是我們的 Debug 。
通過command的命令:Debug T1.exe
由上圖,我們可以知道兩個信息。
我們可以用Debug T1.exe實驗一下,如圖。
發現DS=075A,CS=076A,但是,發現一個SS和書上的不一樣,一個是相差10H,而實際上我們做的實驗是相差了09H,我想可能標準不一樣吧。我們忽略細節(找不到為什么,不過我們只要知道 PSP 是256個字節就對了)。
當我們執行到 int 21h 的時候,需要使用 p命令,這里不說明原因(因為t命令是單步執行,而p是跳出循環)。
q命令 退出Debug。
實驗 3 編程、編譯、連接、跟蹤
這里先吐槽一下,前面2章教我們使用命令的時候,我做筆記是有點想吐的。因為太冗余了,我們只要記住某些命令就行了。可能是本人認為學習匯編是為了學習匯編語言的思想。也許我們需要使用到比如像“中斷”這樣模式的編程。
(1)將下面的程序保存為 t1.asm 文件,將其生成可執行文件 t1.exe 。
(2)用 Debug 跟蹤 t1.exe 的執行過程,寫出每一步執行后,相關寄存器中的內容和棧頂的內容。
編寫完代碼后,如圖。
這樣生成了t1.exe文件。
(3)PSP的頭兩個字節是CD 20,用 Debug 加載 t1.exe,查看PSP的內容。
(注意,一定要做完這個實驗才能進行下面的課程。)
本章完。
總結
以上是生活随笔為你收集整理的第一个程序---汇编学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 互联网日报 | 2月4日 星期四 | 阿
- 下一篇: 中国娱乐社交企业出海发展专题报告