預備知識 debug
什麼是debug?
debug 是DOS、windows都提供的實模擬程式的除錯工具。使用它,可以檢視CPU各種暫存器中的內容、記憶體的情況和在機器碼級跟蹤程式的執行
用到的debug功能
常用:
1 R:檢視、改變CPU暫存器的內容 2 D:檢視記憶體中的內容 3 E:改寫記憶體中的內容 4 U:將記憶體中的機器指令翻譯成彙編指令 5 T:執行一條機器指令 6 A:以彙編指令的格式在記憶體中寫入一條機器指令
注意:這裡關注的是記憶體單元而非單元中的內容。打個比方:一堆各色的小球要放到對應顏色的房子裡,在把小球拿到房子裡之前要先查詢房子的位置,這裡不能拿著小球去找房子,找到房子之後把小球拿過去。還有小球中可以存放字條,字條上可以寫入內容等其餘的操作還在學習。
所有
百度百科中可以查到更詳細的解釋
R:檢視、改變CPU暫存器的內容
注意CS和IP的值,CS=073F,IP=0100,也就是記憶體073F:0100處的指令為CPU當前要讀取、執行的指令。在所有暫存器的下方,debug還列出了CS:IP所指向的記憶體單元處所存放的機器碼,並將它翻譯成為彙編指令。可以看到,CS:IP所指向的記憶體單元為073F:0100,此處存放的機器碼為0000,對應的彙編指令為add [BX+SI],AL
D:檢視記憶體中的內容
檢視記憶體5000H處的內容,可以使用【d 段地址:偏移地址】 ,debug將列出從指定記憶體單元開始的128個記憶體單元的內容
注:我們看到的記憶體中的內容,在不同的計算機中是不一樣的,也可能每次用debug看到的內容都不相同,因為我們用debug看到的都是原來就在記憶體中的內容,這些內容受隨時都有可能變化的系統環境的影響,當然也可以改變記憶體、暫存器中的內容
輸出的三部分內容
一、左
每行的起始地址
二、中
從指定地址開始128個記憶體單元的內容,用十六進位制格式輸出,每行輸出16的整數倍的地址開始,最多輸出16個單元的內容。從圖中我可以知道,記憶體500:0單元中的內容是06H,記憶體500:20單元中的內容是07H
每行中的【-】是用來分割的,前後分為各8個單元
三、右
每個記憶體單元中的資料對應的可顯示的ASCII碼字元,沒有對應的ASCII字元時,debug會用【.】來代替
E:修改記憶體單元的內容
使用e命令修改單元的內容
一、e 1000:0 5 1 2 3 4 5 修改一段
二、e 1000:0 單個修改
單個修改的時候單擊回車修改結束,單擊空格修改下一個
三、e 1000:0 5 E 'E' 'E' E E 向記憶體中寫入字元
U:將記憶體中的機器碼轉換為彙編指令
u 1000:0 從1000:0開始轉換為彙編指令
輸出分為3個部分,每一條機器指令的地址、機器指令、機器指令所對應的彙編指令
機器指令的地址 機器指令 機器指令對應的彙編指令
T:逐條跟蹤程式的執行,每條指令執行後都將顯示各暫存器的內容
可以通過e命令寫入指令太麻煩了懶得細看,跳過
通過t可以執行寫入的指令
A:將指令直接彙編成機器碼輸入到記憶體中