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