Debug的基本使用()
Debug是一個通過操作系統(tǒng)(os)對cpu寄存器進行訪問用于學(xué)習(xí)匯編的程序,但是如今的win10(64位)已經(jīng)不支持cmd打開debug,但是我們可以通過DOSBOX模擬器對其進行訪問。
安裝方法:先在https://www.dosbox.com中下載dosbox(默認路徑在C:\Program Files (x86)),接下來在網(wǎng)上下載debug.exe,為了方便可以直接在D盤下創(chuàng)一個Debug文件夾放到里邊即可。接下來修改一下DOSBox 0.74-3 Options.bat里的路徑,把最后的路徑掛到
MOUNT C D:\DebugC:debug
中即可打開Dosbox。
debug 的基本用法
| debug 基本指令 | 指令全稱 | 用法 | 用途 |
|---|---|---|---|
| ? | ---------- | ? | 顯示debug的命令列表 |
| A | assemble | A [ address ] | 將輸入源程序的指令匯編成目標代碼并從指定的地址單元開始存放。若省缺起始地址,則從當(dāng)前CS:100地址開始存放。A命令按行匯編,主要用于小段程序的匯編或?qū)δ繕顺绦虻男薷?/td> |
| C | compare | C range address | 比較內(nèi)存的兩個部分 |
| D | dump | D [ range ] | 顯示部分內(nèi)存的內(nèi)容 |
| E | enter | E address [ list ] | 從指定地址開始,將數(shù)據(jù)輸入 |
| F | fill | F range list | 使用指定值填充一段內(nèi)存 |
| G | go | G [ = address ] [ addresses ] | 運行在內(nèi)存中的可執(zhí)行文件 |
| H | hex | H value1 value2 | 執(zhí)行十六進制運算 |
| I | input | I port | 顯示來自特定端口的 1 字節(jié)值 |
| L | load | L [ address ] [driver ] [ firstsector ] [ number ] | 將文件或磁盤扇區(qū)內(nèi)容加載到內(nèi)存 |
| M | move | M range address | 復(fù)制內(nèi)存塊中的內(nèi)容 |
| N | name | N [ pathname ] [ arglist ] | 指定 Debug l(加載)或 w(寫入)命令的可執(zhí)行文件的名稱,或者指定正在調(diào)試的可執(zhí)行文件的參數(shù) |
| O | output | O port byte | 向輸出端口發(fā)送 1 個字節(jié)的值 |
| P | proceed | P [ =address ] [ number ] | 執(zhí)行循環(huán)、重復(fù)的字符串指令、軟件中斷或子例程;或通過任何其他指令跟蹤 |
| Q | quit | Q | 退出 debug會話,不保存當(dāng)前測試文件 |
| R | register | R [ register ] | 若給出寄存器名,則顯示該寄存器的內(nèi)存并可進行修改。缺省寄存器名,則顯示所有寄存器的內(nèi)容及當(dāng)前值( 不能修改 ) |
| S | search | S range list | 在部分內(nèi)存中搜索一個或多個字節(jié)值的模式 |
| T | trace | T [ =address] [ value ] | 執(zhí)行一條指令,然后顯示所有寄存器的內(nèi)容、所有標志的狀態(tài)和Debug下一步要執(zhí)行的指令的解碼形式 |
| U | unassemble | U [ range ] | 反匯編字節(jié)并顯示相應(yīng)的原語句 |
| W | write | W [address ] [ drive ] [ firstsector ] [ number ] | 將測試文件寫入磁盤 |
| XA | allocate expanded memory | XA [ # pages ] | 分配擴展內(nèi)存 |
| XD | deallocate expanded memory | XD [ handle ] | 釋放擴展內(nèi)存 |
| XM | map expanded memory pages | XM [ Lpage ] [ Ppage ] [ handle ] | 映射擴展內(nèi)存頁 |
| XS | display expanded memory status | XS | 顯示擴展內(nèi)存的狀態(tài) |
以上便是debug的簡介。
學(xué)習(xí)匯編語言并且調(diào)用debug調(diào)試的時候,主要使用到 -L -U -D -G -T -P 指令
-L 裝入 -G 運行 -U 反匯編 -T 單步(可以進入子程序) -P 單步(不進入子程序)-D 查詢內(nèi)存
匯編語言程序建立步驟:
- edit 建立源文件 格式:edit xxx.asm ( 必須以 asm 為擴展文件名,否則不能使用 masm 調(diào)用 ),生成 obj 文件。
- masm 生成鏈接文件 格式:masm xxx.asm 然后生成 obj 文件,obj 文件是可連接文件,接下來需要使用link鏈接文件生成exe
- link 生成 exe 文件 格式:link xxx.obj 生成 exe 可執(zhí)行文件
接下來我們進行一些基本的操作
-r 命令查看,改變cpu寄存器內(nèi)容
-d 查看內(nèi)存中的內(nèi)容
-e 命令改寫內(nèi)存中的內(nèi)容
-u 將機器指令翻譯為匯編指令
-t 執(zhí)行下一條指令
-a 以匯編指令方式寫入一條機器指令
首先介紹一下基本內(nèi)容,看下初始配置:
看這些寄存器的名稱應(yīng)該都是8086的寄存器名稱2333
在電腦(CISC)的cpu指令由pc(cs段地址和ip偏移地址往地址總線傳輸?shù)刂罚┛刂疲虼宋覀兛梢孕薷腸s和ip值對pc進行操作。
CS:代碼段寄存器i ES:額外的寄存器
DS:數(shù)據(jù)段寄存器 (A-D)X:普通寄存器
SS:堆棧段寄存器 SP:堆棧寄存器
BP:基址寄存器 DI:變址寄存器
SI:源址寄存器

修改cs,ip地址(-r cs||ip),dosbox里默認是2個字節(jié)16位,即4個十六進制表示:

執(zhí)行下一條指令(-t),可發(fā)現(xiàn)ip+=3,占了三個字節(jié),在-d查看一下內(nèi)存:

下面我們隨意用-a來操作一下(輸入命令):

然后修改cs:ip往下執(zhí)行......:

按quit即可退出,以上就是debug的基本匯編操作用法,觀看愉快?。。?/p>
相關(guān)文章
使用匯編語言實現(xiàn)if else 循環(huán)函數(shù)調(diào)用的具體方法
這篇文章主要介紹了使用匯編語言實現(xiàn)if else 循環(huán)函數(shù)調(diào)用的具體方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01
匯編語言80x86系統(tǒng)通用數(shù)據(jù)傳送指令詳解
這篇文章主要為大家介紹了匯編語言80x86系統(tǒng)通用的數(shù)據(jù)傳送指令詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2021-11-11
ARM匯編判斷之如何用匯編判斷數(shù)組中正負數(shù)個數(shù)
這篇文章主要介紹了ARM匯編判斷之如何用匯編判斷數(shù)組中正負數(shù)個數(shù),在匯編語言中程序的基本框架是不變的,這里我們可以直接把正向遍歷的程序給貼過來,然后我們思考怎么運用判斷后綴把數(shù)組中正數(shù)和負數(shù)分開,進行判斷個數(shù)和分別求和,需要的朋友可以參考下2022-04-04
os_object_release Crash 排查記錄分析
這篇文章主要為大家介紹了os_object_release Crash 排查記錄分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11

