window10下搭建彙編環境
0x00 軟件和資料
軟件包含:
- dosbox
- debug
- masm
- link
exe2bin(這個暫時可以忽略)
資料包含:
- 王爽老師的《彙編語言》第二版
- 《彙編語言》第二版 中的習題答案
- 彙編語言編程藝術(清晰版)
下載地址:
鏈接:https://pan.baidu.com/s/17QfCsbvYNwLnUCHIzsluDQ
提取碼:i27u
0x01 環境搭建
把軟件放在同一個文件夾下,
我的放在D/Debug下
- 安裝dosbox
選擇安裝目錄(最好是自己選擇一個目錄,方便後面查找)
我在D盤創建了一個dosbox文件夾,把它安裝在D盤的dosbox下,選擇好安裝目錄後,點擊安裝即可。
2. 修改dosbox配置文件
安裝好dosbox後,
我們相當於有了一個可以運行debug,masm等(我們寫的彙編程序也是用這個終端來運行)程序的終端程序(cmd,windows10自帶的cmd是運行不了debug,masm。。程序的)。
現在有了可以運行這些程序的cmd,
現在去嘗試運行一下debug,
我們要先轉到debug程序所在的目錄下,
(我的debug程序放在了D/Debug)
在dosbox中輸入:
mount D D:/Debug
(mount命令是掛載硬盤或鏡像的命令,這條指令我的的理解是:把D/Debug文件夾裏的東西在D盤上創建了一個鏡像)
回車之後再輸入:D:
然後回車,就轉到了所在目錄
再輸入debug即可運行debug程序(運行其他程序同理,因爲之前我們就把它們放在了同一個目錄下):
debug常用命令(不區分大小寫)有:
r: 查看,修改 cpu寄存器中的內容;
d:查看內存中的內容
e:改寫內存中的內容
u:將機器指令翻譯成彙編指令
t:執行下一條彙編指令
a:以彙編的格式在內存中寫入一條機器指令(寫彙編指令)
其他指令請自行嘗試,大膽嘗試!(這裏並不會損害我們自己的電腦)
這裏有一個問題:每次我們打開dosbox,都需要寫命令轉到需要運行的程序的文件夾然後才能運行程序,很不方便。
我想要的是直接打開dosbox,直接輸入程序名即可運行。
所以我們就需要修改一下dosbox的配置,
在dosbox安裝目錄中,找到如下圖選中的這個文件
用記事本打開這個文件(雙擊會默認用記事本打開),
在文件結尾寫入並保存:
MOUNT D D:\Debug
D:
現在打開dosbox,直接輸入程序名就可以運行程序了。
3. 其他
debug:調試程序(數據默認就是十六進制,不需要加h)
masm:編譯程序
link:鏈接程序
dosbox:終端運行程序
對於debug和masm,link這三個程序的切換,
在運行debug的時候,輸入quit
或q
可退出運行debug,
從而可以輸入其他程序名來運行其他程序.
但是對於masm和link要退出,目前我不知道有什麼退出命令,
我的做法是,隨便輸入一個字母,按幾下下回車即可。(或者關閉重新打開dosbox,再輸入其他程序名)
0x03 寫彙編程序實例
1. 小型彙編程序:
可以用debug寫。
(但是一般還是用記事本或Notepad++等編輯軟件寫好,然後在dosbox下編譯鏈接運行。debug一般都是用來調試的。)
下面用debug寫一個簡單的程序:
輸入u可以查看彙編指令
輸入t 即可執行一條彙編指令,然後可以觀察寄存器的變化
執行完可以看到AX = 6
2. 比較大型的彙編程序:
用記事本或Notepad++寫好,然後在dosbox下編譯鏈接運行.
比如寫一個:計算2^8的程序:
在debug,masm,link…所在目錄下(這樣編譯運行的時候就直接可以寫文件名,而不用寫具體路徑)新建文件2_8.asm,
用記事本打開,寫入:
assume cs:code
code segment
mov ax,2
mov cx,8
s: add ax,ax
loop s
mov ax,4c00h
int 21h
code ends
end
保存。
然後打開dosbox。
編譯,輸入:
masm 2_8.ASM
(這裏是標準的文件,.ASM可以不加文件類型後綴,如果是txt,則需要加上文件類型後綴.txt)
如果要給編譯得到的文件重命名則在Object fileName後輸入文件名,
否則直接回車,一路回車。
編譯後會得到一個.OBJ文件:
鏈接,輸入:
link 2_8
一路回車。。
最終得到了一個可執行文件:2_8.EXE
直接在dosbox中輸入:
2_8.EXE
執行,執行完成,屏幕並不會顯示什麼,因爲並沒有寫輸出相關的指令(彙編輸出有點麻煩,要把16進制結果進行轉換,現在就是熟悉一下編程環境)。
現在只能使用debug來追蹤程序指令的執行。
輸入:
debug 2_8.EXE
輸入r,可以查看當前寄存器的情況,
輸入u,可以看到我們的彙編指令已經加載入了內存中。
然後就是t,單步執行指令了。
可以使用:g 偏移地址來一跳過我們不想追蹤的部分,如下圖,
0006之前的已經執行完了,即0006以前的指令看上去“一步就執行完了”.
我們繼續輸入t,就可以追蹤循環部分。
0x04
…彙編輸出真TM麻煩(不過,爲了 代碼瞭解底層實現 還是需要好好學。。)
來一個簡單的“Hello world!”輸出吧:
不解釋,多看書~