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






