前言
本學期學校安排有匯編語言這門課,需要自己搭建匯編語言開發環境,特此寫下本文記錄搭建過程.
關于搭建匯編語言開發環境的教程,我也找了許多,可看下來卻依舊一頭霧水,經過本人摸索,同時結合網上教程,欲寫下這篇易懂的文章.
準備工作
1.下載DOSBox
工具介紹:DOSBox是一個DOS模擬程序,由于它采用的是SDL庫,所以可以很方便的移植到其他的平臺.目前,DOSBox已經支持在Windows、Linux、Mac OS X、BeOS 、palmOS、Android 、webOS、os/2等系統中運行.不少DOS下的游戲都可以直接在該平臺上運行.
工具官網:DOSBox, an x86 emulator with DOS
項目主頁:
https://sourceforge.net/projects/dosbox/
下載鏈接1(32位):
http://sourceforge.net/projects/dosbox/files/dosbox/0.74/DOSBox0.74-win32-installer.exe/download/
下載鏈接2(這個是我下載好的,可能會快一點):
https://idefun.lanzoux.com/i4TQgm4zjkf/
2.下載匯編工具包
下載鏈接:
https://idefun.lanzoux.com/i4TQgm4zjkf/
匯編工具截圖
安裝教程
1.安裝DOSBox
雙擊運行DOSBox安裝程序
點擊next
選擇安裝位置(我選擇都是D:DOSBox)然后點擊install即可
安裝位置要記得,后面要用
2.創建工作目錄
安裝完畢創建一個工作目錄(目錄位置及目錄名可自定義)
我的是在D:/DOSBox/Debug
之后再在Debug下創建兩個文件夾ASM(放自己寫的匯編程序)和MASM(放匯編工具)
將匯編工具放入MASM文件夾
3.掛載工作目錄
打開DOSBox安裝目錄(我的在D:DOSBox)
打開后找到DOSBox 0.74 Options.bat這個批處理文件
直接雙擊運行會出現一個記事本
使用快捷鍵Ctrl+F查找其中的[autoexec]部分(一般在文件末尾)
在文件中添加下列內容并保存
MOUNT F D:DOSBoxDebug
set PATH=%PATH%;F:MASM;
F:
cd F:ASM
cls
命令解釋:
#掛載工作目錄掛載到虛擬盤符F(虛擬盤符可自定義,命令不區分大小寫)
MOUNT F D:DOSBoxDebug
#添加系統臨時變量(此時的F代表的是D:DOSBoxDebug)
set PATH=%PATH%;F:MASM;
#轉到F盤符
F:
#切換到F:ASM目錄
cd F:ASM
#執行一次清屏
cls
如果不加cls,打開會是這樣
加上cls,打開會是這樣(我覺得更美觀,依個人喜好)
注意:不進行此種配置的話,每次打開DOSBox是需要手動輸入上述命令,非常麻煩
使用說明
DOSBox常用快捷鍵
快捷鍵 |
作用 |
Alt+Enter |
切換全屏 |
Ctr+F1 |
改變鍵盤映射 |
Alt+Pause |
暫停模擬 |
Ctrl+Alt+F5 |
開始/停止錄制視頻 |
Ctrl+F4 |
交換掛載的磁盤映像,也就是更新磁盤文件 |
Ctrl+F5 |
截圖 |
Ctrl+F6 |
開始/停止錄制聲音 |
Ctrl+F7 |
減少跳幀 |
Ctrl+F8 |
增加跳幀 |
Ctrl+F9 |
關閉DOSBOX |
Ctrl+F10 |
捕捉/釋放鼠標 |
Ctrl+F11 |
模擬減速 |
Ctrl+F12 |
加速模擬 |
Alt+F12 |
不鎖定速 |
注意:以上快捷鍵我并沒有全部測試,更多詳細信息參見README.txt(在DOSBox安裝目錄中的Documentation里面)
調整窗口大小
初始的界面很小,且不能直接拉伸界面,所以有需要的可以按照下面的方法調整一下
雙擊打開DOSBox 0.74 Options.bat
使用快捷鍵Ctrl+F查找windowresolution字段
將
windowresolution=original
output=surface
改為
windowresolution=800x500 #800x500為自定義大小,可修改
output=opengl
注意:不用刪除原來的語句,在前面加上#注釋掉即可
保存后,重啟DOSBox生效
創建并編輯文件
關于創建并編輯文件,如果你的工作目錄(掛載的目錄)有EDIT.COM文件(我提供的匯編工具包中有),那么你就可以在DOSBox中創建并編輯文件,如果沒有請使用我提供的工具包或者耐心往下看.
使用DOSBox創建并編輯文件(不推薦)
打開DOSBox使用下面命令創建并編輯test.asm文件
edit test.asm
回車后進入下面界面即可進行編輯(注意:鼠標箭頭只能在編輯器里活動,想將鼠標退出來的話可以用Ctrl+F10組合鍵退出)
使用記事本創建并編輯文件(其他編輯器也可以)
下面以此種方式創建test.asm文件
新建文本文檔,將下面代碼復制到里面并保存
datas segment
buf db'Hello, World!$'
datas ends
stacks segment stack
db 200 dup(0)
stacks ends
codes segment
assume cs:codes,ds:datas,ss:stacks
start:
mov ax,datas
mov ds,ax
mov dx,seg buf
lea dx,buf
mov ah,09h
int 21h
mov ah,4ch
int 21h
codes ends
end start
之后重命名為test.asm
編譯調試
打開DOSBox輸入下面命令
masm test.asm
回車后會詢問文件名,建議直接回車
編譯程序提示輸入交叉引用文件的名稱,這個文件同列表文件一樣,是編譯器將源程序編譯為目標文件過程中產生的中間結果.可以讓編譯器不生成這個文件,直接按Enter鍵即可
可以像上圖一樣分別輸入文件名,打開ASM查看如下
本文全部默認即不分別輸入文件名直接回車
打開ASM文件夾查看如下
繼續輸入命令
link test.obj
運行完畢,查看ASM文件夾
繼續執行下列命令
debug test.exe
debug的簡單使用
debug是Dos、windows提供的實模式(8086方式)程序的調試工具
- 可以查看CPU各種寄存器的內容
- 可以查看內存的情況
- 可以在機器碼級別跟蹤程序的運行
命令 |
作用 |
R命令 |
查看、改變CPU寄存器的內容 |
D命令 |
查看內存中的內容(機器指令形式)(16進制顯示) |
E命令 |
改寫內存中的內容,即提供指令(使用機器指令),用得比較少,多為A命令 |
U命令 |
查看內存中的內容(將機器指令形式轉換為匯編指令的形式)(反編譯) |
T命令 |
執行一條匯編(機器)指令(就是執行當前指令緩沖器中的指令) |
A命令 |
相比較E,使用匯編指令進行內存修改——向內存提供機器指令 |
P命令 |
在遇到匯編指令為int xx 時,使用p指令結束(否則CPU會指向一個 |
G命令 |
執行完exe運行結果顯示 |
Q命令 |
退出debug |
?命令 |
查看指令幫助 |
R命令
查看CPU寄存器的內容
標識名 |
置位 |
復位 |
溢出Overflow(是否) |
OV |
NV |
向Direction(減量/增量) |
DN |
UP |
中斷Interrupt(允許/屏蔽) |
EI |
DI |
符號Sign(負正) |
NG |
PL |
零Zero(是否) |
ZR |
NZ |
輔助進位Auxiliary Carry(是否) |
AC |
NA |
奇偶Parity(偶奇) |
PE |
PO |
進位Carry(是否) |
CY |
NC |
改變標志位的值
rf
改變CPU寄存器的內容
改變ax的值
直接回車退出修改
改變CS:IP的值
D命令
使用D命令,debug將輸出3部分內容:
- 中間是從指定地址開始的128個內存單元的內容,用16進制的格式輸出,每行的輸出從16的整數倍的地址開始,最多輸出16個單元的內容.注意在每行的中間有一個"-",它將每行的輸出分為兩部分,這樣便于查看
- 左邊是每行的起始地址
- 右邊是每個內存單元中的數據對應的可顯示的ASCII碼字符.若沒有對應可顯示的ASCII字符,debug就用"."來代替
在一進入debug后,用D命令直接查看,將列出debug預設的地址處的內容
使用d 段地址:偏移地址查看(以d 1000:0為例)
格式:d 段地址:偏移地址
使用"d 段地址:偏移地址"的格式來查看,debug將列出從指定內存單元開始的128個內存單元的內容
在使用"d 段地址:偏移地址"之后,接著使用D命令,可列出后續的內容
也可以指定D命令的查看范圍,此時采用"d 段地址:起始偏移地址 結尾偏移地址"的格式
若輸入的地址不是16的倍數,則輸出效果是這樣的
E命令
將內存1000:0-1000:9單元中的內容分別寫為0、1、2、3....、9,可以用"e 段地址:起始地址 數據 數據 數據 ……"的格式來進行
用E命令以提問的方式來逐個地修改從某一地址開始的內存單元中的內容
- 紅色部分為用戶輸入的修改的數據,到了某一內存單元的時候,可以選擇修改(輸入要修改的數值),也可以選擇不修改(直接按空格),處理完一個內存單元之后,按空格,繼續處理下一個內存單元;全部都處理完畢之后,按enter
可以用E命令向內存中寫入字符
也可以用E命令向內存中寫入字符串
用E命令向內存中寫入機器碼,用T命令執行內存中的機器碼
e 1000:0 b8 01 00 b9 02 00 01 c8
機器碼 |
對應的匯編指令 |
b80100 |
mov ax,0001 |
b90200 |
mov cx,0002 |
01c8 |
add ax,cx |
用E命令向從1000:0開始的內存單元中寫入了8個字節的機器碼
用D命令查看內存1000:0~1000:1f中的數據(從數據的角度看一下寫入的內容)
用U命令查看從1000:0開始的內存單元中的機器指令和他們所對應的匯編指令
U命令
對機器代碼反匯編顯示
按地址反匯編
u 地址
該命令從指定地址開始,反匯編32個字節,若地址省略,則從上一個U命令的最后一個指令的下一個單元開始顯示32個字節
按范圍反匯編
u 范圍
T命令
?命令
輸入?查看更多命令
結果如下: