匯編語(yǔ)言?masm5與debug命令使用方法小結(jié)
前言
在學(xué)習(xí)完王爽老師《匯編語(yǔ)言》(第四版)第六章之后,我決定整理一下masm5.0與debug命令的使用方法,方便之后回顧。(我使用的環(huán)境是DosBox。)
一、匯編程序的代碼框架
以下是匯編程序基本規(guī)范。其中也包含了一些小知識(shí)點(diǎn)。注釋符號(hào)我借用了java語(yǔ)言中的“//”。
assume cs:code ? ? //開(kāi)頭使用關(guān)鍵字assume,并且要將段寄存器與段名關(guān)聯(lián) ? a segment ? ? ? //數(shù)據(jù)、代碼、棧 要分段存放,段用“段名 segment”開(kāi)頭,用“段名 ends”結(jié)尾 ? db 1,2,3,4,5,6,7,8 ? ?//db 為8字節(jié)型數(shù)據(jù)申請(qǐng)空間(byte),或理解為定義了8個(gè)字節(jié)型數(shù)據(jù) ? a ends ? ? ? ? ? ?//不足16字節(jié)的,系統(tǒng)會(huì)分配16字節(jié)的空間來(lái)存放 ? b segment ? dw 0123H,0456H,0789H,0abcH ? ?//匯編中數(shù)據(jù)不能以字母開(kāi)頭,如“a234H”就要寫成“0a234H” ? b ends ? c segment ? ?//棧段 要開(kāi)辟一定的空間作為棧使用 ? dw 0,0,0,0,0,0,0,0 ? ?//dw 開(kāi)辟4個(gè)字型數(shù)據(jù)的空間(word),或理解為定義了4個(gè)字型數(shù)據(jù) ? c ends ? code segment ? ? //代碼段,code是標(biāo)識(shí)符,不是關(guān)鍵字 ? start: ? ? ? ? ? //start是標(biāo)識(shí)符,上下呼應(yīng),標(biāo)識(shí)程序入口,即cs:ip指向處 ? ? ? mov ax,11H ? ? //H標(biāo)識(shí)十六進(jìn)制,也可以用十進(jìn)制 ? ? ? mov cx,8 ? ?//通常在循環(huán)之前,用cx保存循環(huán)次數(shù) ? ? ? s: ? ? ? ? ? ? ?//s是標(biāo)號(hào),標(biāo)識(shí)一段循環(huán)體,上下呼應(yīng) ? ? ? ? ? add ax,10H ? ? ? loop s ? ? ? ? ? ? //CPU執(zhí)行cx-1后若≠0,則跳到標(biāo)號(hào)s所在處執(zhí)行,否則繼續(xù)向下執(zhí)行 ? ? ? mov ax,4c00H ? ?//這兩行作用是 程序返回 ,這是匯編程序的規(guī)范 ? ? ? int 21H ? code ends ? ?//代碼段結(jié)束 end start ? ? ?//end是程序結(jié)束。 ?start是標(biāo)識(shí)符,標(biāo)識(shí)程序入口
二、使用masm生成exe文件
1.編譯
將寫好代碼的源程序保存為 文件名.asm文件,然后在DosBox中編譯。
編譯最簡(jiǎn)單的方法就是在DosBox中輸入 masm 文件名 ; 回車。如下。
masm 1;
如果不加分號(hào),那么連續(xù)回車就可以,中間步驟生成的中間文件,現(xiàn)在不必去管它。
這一步是在當(dāng)前文件夾下生成.obj文件。
沒(méi)有指明路徑是因?yàn)樵闯绦?.asm與masm5.0放在同一文件夾下。如果源程序放在別處,就要指明路徑。
2.連接
最簡(jiǎn)單的方法就是在DosBox中輸入 link 文件名 ; 回車。如下。
link 1;
如果不加分號(hào),就要多回車幾次。中間生成的中間文件,現(xiàn)在不必去管它。
這一步是在當(dāng)前文件夾下生成.exe文件。
同理,沒(méi)有指明路徑是因?yàn)?.obj與link.exe放在同一文件夾下,否則要指明路徑。
三、使用debug調(diào)試程序
在DosBox中可以直接運(yùn)行exe程序,如下。
1.exe
但更多時(shí)候需要使用debug進(jìn)行分步調(diào)試。調(diào)試方法是,在DosBox中輸入 debug 文件名.exe 回車。如下。
debug 1.exe
四、debug命令小結(jié)
1.R命令 查看、修改寄存器內(nèi)容
(1)查看CPU寄存器的內(nèi)容
R 回車
(2)改變CPU寄存器的內(nèi)容
例如將段寄存器DS的值改為2000H:
R DS 回車, 2000 回車(輸入目標(biāo)值)
2.D命令 用于查看內(nèi)存內(nèi)容(從數(shù)據(jù)角度)
(1)D回車,查看默認(rèn)地址的內(nèi)容
(2)D 段地址:偏移地址 回車,查看指定地址的內(nèi)容,如 D 2000:0 。
(3)段地址可以使用段寄存器名,如 D ds:0002 。
(4)可以指定查看范圍,D 段地址:起始偏移地址 結(jié)尾偏移地址 ,如 D 1000:0 f 。
3.E命令 用于改寫內(nèi)存內(nèi)容(從數(shù)據(jù)角度)
(1)E 段地址:起始偏移地址 數(shù)據(jù) 數(shù)據(jù) 數(shù)據(jù) ... ,用空格分隔數(shù)據(jù),用回車來(lái)退出修改。
(2)用提問(wèn)的方式一個(gè)字節(jié)一個(gè)字節(jié)地改寫。E 段地址:偏移地址 回車,(屏幕顯示原有數(shù)據(jù))然后輸入新數(shù)據(jù),回車。
(3)用第一種方式還可以寫入字符或字符串。注意定界符,字符如'a',字符串如"Hello"。
4.U命令 用于查看內(nèi)存內(nèi)容(從指令角度)
即查看內(nèi)存內(nèi)容對(duì)應(yīng)的匯編指令。
與D命令相同的使用方式,只不過(guò)查看角度不同而已。
如 U ds:0 回車,查看 ds:0000處開(kāi)始的匯編指令。
5.A命令 用于改寫內(nèi)存內(nèi)容(從指令角度)
即方便地輸入?yún)R編指令存儲(chǔ)在內(nèi)存中。
注意,指令必須一行一行地輸入。輸入一條指令之后要回車。最后以回車結(jié)束輸入。
(1)a 回車,從默認(rèn)地址開(kāi)始輸入指令。
(2)a 段地址:偏移地址 回車,從指定地址開(kāi)始輸入指令。
6.T命令 執(zhí)行指令
用于執(zhí)行cs:ip當(dāng)前指向的那條指令。(IP寄存器將自動(dòng)改寫。)
7.P命令
(1)遇到程序返回語(yǔ)句 int 21H 時(shí),要用P命令而不是T命令執(zhí)行。
(2)遇到loop循環(huán)語(yǔ)句時(shí),使用P命令可以自動(dòng)執(zhí)行完整個(gè)loop(也就是執(zhí)行到cx=0),而不用一步步執(zhí)行。
8.G命令 跳轉(zhuǎn)到某條指令
用于跳到某一條指令處,例如 G 0012 回車,即表示設(shè)置IP=0012H。
9.其它
alt+Enter可以全屏/恢復(fù) 窗口大小。
總結(jié)
本文總結(jié)了匯編程序的基本框架及規(guī)范、masm5工具的基本使用方法、debug命令的基本使用方法。
相關(guān)文章
從匯編代碼開(kāi)始全面解析synchronized還原最真實(shí)的偏向鎖
這篇文章主要為大家介紹了從模板解釋器匯編源碼開(kāi)始分析還原最真實(shí)的偏向鎖實(shí)現(xiàn),解釋monitorenter字節(jié)碼命令的方法開(kāi)始,從匯編代碼開(kāi)始全面解析synchronized2022-02-02匯編語(yǔ)言實(shí)現(xiàn)在指定字符串中搜索字符''A''的方法
這篇文章主要介紹了匯編語(yǔ)言實(shí)現(xiàn)在指定字符串中搜索字符'A'的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02匯編語(yǔ)言系列之匯編實(shí)現(xiàn)各種碼制的轉(zhuǎn)換(思路詳解)
本文列出了十六進(jìn)制轉(zhuǎn)二進(jìn)制、十進(jìn)制、ASCII碼及大小寫字母轉(zhuǎn)換的代碼,對(duì)匯編語(yǔ)言系列之實(shí)現(xiàn)各種碼制的轉(zhuǎn)換問(wèn)題感興趣的朋友跟隨小編一起看看吧2021-11-11