初學彙編之Debug命令
由於本人的系統是win10的,老師讓裝虛擬機器,偷個懶就沒裝,裝了一個 masm for windows 整合環境包,事實證明,這個比較方便而且,和命令列的差距就是命令列需要鍵入masm xxx.asm 等等的語句,本人也有相容windows 64位系統的命令列,不必裝虛擬機器, 需要的讀者可以在下面留言
裝載的過程很簡單,就是傻瓜式安裝, 然後點開輸入程式碼 儲存執行,然後最重要的就是debug環境,讓我無從入手,看了許多部落格之後在這裡總結一下:
來一段程式實踐一下:
DATAS SEGMENT
DATA DB 78H, 56H, 34H, 12H;此處輸入資料段程式碼
RTL DB 4 DUP(0)
DATAS ENDS
STACKS SEGMENT
STK DB 30 DUP(0);此處輸入堆疊段程式碼
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV AL, DATA;此處輸入程式碼段程式碼
MOV AH, DATA+1
MOV BL, DATA+2
MOV BH, DATA+3
NEG AL
CMC ;進位取反
NOT AH
ADC AH, 0
NOT BL
ADC BL, 0
NOT BH
ADC BH, 0
MOV RTL, AL
MOV RTL, AH
MOV RTL+2, BL
MOV RTL+3, BH
MOV AX,4C00H
INT 21H
CODES ENDS
END START
…作者無法新增圖片 算了,讀者請根據下面的指令自己看吧!
1: 輸入 -r 檢視或者修改暫存器,可以修改CS IP來指向要執行彙編的記憶體地址
-r 回車 檢視
-r ax 回車 修改 ax的值
-r cs 回車 修改 cs的值
-r ip 回車 修改 ip的值
2: 輸入-D 檢視記憶體中的資訊
-d 1000:0000 檢視段地址為1000H ,偏移地址為0開始的記憶體資訊
-d 1000:0000 00ff 就是檢視 1000:0000 到1000:00ff的記憶體資訊
檢視主機板生產日期
-d fff0:0000 00ff 可以看到右下角的 08/14/08 格式月/日/年, 08年8月14號生產的主機板
這裡的生產日期是隻讀的,無法修改,通過-e修改表面上看是改過了,下次開啟後又恢復之前資料了
如果直接用 -d 0100 則會顯示 DS:0100處的記憶體資訊,也就是顯示段地址為ds,便宜地址為0100的記憶體資訊。
-d ds:0100 也可以這麼使用
3:輸入-E修改記憶體中位置的資訊
-e 1000:0000 1a 00 09 10 a1 61 這樣就可以修改對應段地址為1000H ,偏移地址為0開始的記憶體資訊
-e 1000:0000 ‘a+b’ 這樣就會在記憶體1000:0000處寫入61H(a的ASICC碼) 1000:0001處+ 1000:0002 62
4:輸入-u檢視指定位置對應的彙編指令
-u 1000:0000 檢視該處的彙編指令
-u cs:0000 檢視段地址為cs處的彙編指令
5: 輸入-t 執行指令
-t 執行CS:IP所指向的第一個指令,如果要執行自己寫入記憶體的指令,應該先通過-r來改變CS IP的值,然後再執行 -t 執行
-t 指令預設執行第一條指令後停止。但是當遇到修改SS的指令時,會把緊接的下一條指令也執行了。
6:輸入-a 輸入彙編指令
-a 1000:0000 回車
這樣就可以直接在1000:0000處輸入彙編指令了,注意再輸入完之後,輸入一個空格,表示輸入完畢,輸入完畢後,通過-r修改CS ip來指向對應的記憶體地址,然後就可以通過-t逐行執行了,每執行一次通過-r來看對應的暫存器的變化。
-a 回車 直接輸入彙編指令,預設會在cs:ip處輸入,所以直接用-a 回車輸入彙編指令,然後用-t執行那麼執行的就是剛剛輸入的彙編指令,這樣可以用來除錯彙編指令
7:輸入-g 直接跳轉到哪步執行
用-t是需要一步一步執行,但是往往遇到loop迴圈時候,次數很多,必須要用-g跳到指定行執行
-g 0019 直接跳到便宜地址為0019h處執行
最後用DEBUG載入.exe檔案
用RadASM編寫好asm檔案(新建選擇masm編譯器,dos)編寫好後用編譯、連結、執行,此時生成了對應的exe檔案。比如在:D:\RadASM\Masm\Projects\test\test.exe
再用命令 debug D:\RadASM\Masm\Projects\test\test.exe 回車
-u 檢視對應test.exe裡的彙編指令 -t執行 -g 跳轉到哪個偏移地址執行