📄 dbgcode.inc
字号:
; MMURTL Operating System Source Code
; Copyright 1991,1992,1993, Richard A. Burgess
; ALL RIGHTS RESERVED
; Version x0.8
;=============================================================================
DbgTask:
MOV EAX, OFFSET DbgVidSave ;Save number of vid we interrupted
PUSH EAX
CALL FAR PTR _GetVidOwner
STI
PUSH 2
CALL FAR PTR _SetVidOwner ;Dbgr is Job 2
CMP fDbgInit, 0
JNE DbgInitDone
CALL FAR PTR _ClrScr
MOV fDbgInit, 1
DbgInitDone:
MOV EAX, DbgpTSSSave
;When a fault or debug exception occurs, the values of
;the Instruction Pointer, Code Seg, and flags are not the
;way they were when the exception fired off becuase of the
;interrupt procedure they enterred to get to the debugger.
;We make them the same by putting the values we got from
;the stack (entering the debugger) into the caller's TSS.
;
MOV EBX,dbgOldEflgs ;Store correct flags
MOV [EAX.TSS_EFlags],EBX ;EAX still has DbgpTSSSave
MOV EBX,dbgOldCS ;Store correct CS
MOV [EAX.TSS_CS],BX
MOV EBX,dbgOldEIP ;Store correct EIP
MOV [EAX.TSS_EIP],EBX
;
;NOTE: The "book" says the TF flag is reset by the processor
; when the handler is entered. This only applies if
; the handler is a procedure (NOT a task). The debugger
; is always entered as a procedure, (we chanage the tasks)
; so we shouldn't have to reset it. But we do...
; I guess I'm not reading it right or ROD SERLING LIVES!
;
MOV EBX,[EAX.TSS_EFlags] ;Reset TF in case single steping
AND EBX,0FFFFFEFFh
MOV [EAX.TSS_EFlags],EBX
;We set the FAULT variable based on which interrupt
;procedure was entered.
CMP dbgFAULT,0FFh ;Was the dbgr entered on a FAULT?
JE dbg000 ;NO
;
;NOTE: Must add SS/ESP for a change in CPL on faults!!!
;See page 3-4 System Software Writer's Guide
PUSH 0 ;Display fault message and
PUSH 0 ; and number
CALL FAR PTR _SetXY
LEA EAX,dbgFltMsg
PUSH EAX
PUSH sdbgFltMsg
PUSH 40h ;Color Black on RED
CALL FAR PTR _TTYOut
MOV EAX,dbgFAULT
PUSH EAX
PUSH OFFSET dbgBuf
CALL DDtoHex
LEA EAX,dbgBuf
PUSH EAX
PUSH 8
PUSH 70h
CALL FAR PTR _TTYOut
MOV dbgFAULT, 0FFh ;reset fault indicator
LEA EAX,dbgCRLF
PUSH EAX
PUSH 2
PUSH 07h ;Color White on black
CALL FAR PTR _TTYOut
dbg000:
CALL DbgRegVid ;Display BackLink's Register values
CALL dbgDispMenu ;Display menu
PUSH dbgX ;Back to where we were
PUSH dbgY
CALL FAR PTR _SetXY
;Display Instruction at CS:EIP
MOV EBX,DbgpTSSSave ;Get USER pUserTSS
MOV EAX, [EBX.TSS_EIP]
PUSH EAX
CALL _disassemble ;This puts the instruction on the line
MOV NextEIP, EAX
CALL dbgCheckScroll
;No we read the keybaord
dbg00:
MOV EAX, OFFSET dbgKeyCode
PUSH EAX
CALL ReadDbgKbd ;
MOV EAX, dbgKeyCode
AND EAX, 0FFh ;Lop off key status bytes
CMP EAX, 1Bh ;ESCAPE (Exit)
JE dbgExit
CMP EAX, 0Fh ;Single Step (F1)
JNE dbg04
MOV EBX,DbgpTSSSave ;Get USER pUserTSS
MOV ECX,[EBX.TSS_EFlags] ;
OR ECX,00000100h ;Set TF in flags for single step
MOV [EBX.TSS_EFlags],ECX
JMP dbgExit
dbg04:
CMP EAX, 12h ;Return to CS:EIP (F4)
JNE dbg05
MOV EBX,DbgpTSSSave ;Get USER pUserTSS
MOV EAX, [EBX.TSS_EIP]
PUSH EAX
CALL _disassemble ;This puts the instruction on the line
MOV NextEIP, EAX
CALL dbgCheckScroll ;See if we need to scroll up
JMP dbg00 ;
dbg05:
CMP EAX, 13h ;Display Exchanges
JNE dbg06
CALL dbgDispExchs
JMP dbg000 ;Full display
dbg06:
CMP EAX, 14h ;Return to CS:EIP (F4)
JNE dbg08
JMP dbg00 ;
dbg08:
CMP AL, 16h ;Set Disassembly Address (F8)
JNE dbg09
CALL dbgSetAddr ;Sets NextEIP
PUSH dbgX ;Back to where we were
PUSH dbgY
CALL FAR PTR _SetXY
MOV EAX, NextEIP
PUSH EAX
CALL _disassemble ;This puts the instruction on the line
MOV NextEIP, EAX
CALL dbgCheckScroll ;See if we need to scroll up
JMP dbg00 ;
dbg09:
CMP AL, 17h ;Memory Dump Bytes (F9)
JNE dbg10
MOV BL, 00
MOV dbgfDumpD, BL
CALL dbgDump ;
JMP dbg000
dbg10:
CMP AL, 18h ;Memory Dump DWORDS (F10)
JNE dbg12
MOV BL, 0FFh
MOV dbgfDumpD, BL
CALL dbgDump ;
JMP dbg000
dbg12:
CMP AL, 01Ah ;Info Address dump (F12)
JNE dbg13
CALL DbgInfo ;
JMP dbg00
dbg13: CMP AL, 02h ;Display next Instruction (Down Arrow)
JNE dbg14
MOV EAX, NextEIP
PUSH EAX
CALL _disassemble ;This puts the instruction on the line
MOV NextEIP, EAX
CALL dbgCheckScroll ;See if we need to scroll up
JMP dbg00
dbg14:
JMP dbg00 ;GO back for another key
DbgExit:
LEA EAX,dbgX ;Query XY
PUSH EAX
LEA EAX,dbgY
PUSH EAX
CALL FAR PTR _GetXY
; PUSH 1 ;KBD IRQ
; CALL FAR PTR _UnMaskIRQ
PUSH DbgVidSave
CALL FAR PTR _SetVidOwner ;Change screens back
MOV EAX, DbgpTSSSave ;Return saved pRunTSS
MOV pRunTSS, EAX
MOV BX, [EAX.Tid]
MOV TSS_Sel, BX ;Set up caller's TSS selector
JMP FWORD PTR [TSS]
;Next time we enter the debugger task it will be here!
JMP DbgTask ;Back to begining
;=============================================================================
DbgRegVid:
MOV EBX,DbgpTSSSave ;EBX MUST be DbgpTSSSave
MOV ECX,00 ;TSS Display
MOV ESI,OFFSET DbgTxt00
XOR EAX,EAX
MOV AX,[EBX.TSSNum] ;Number of this TSS
CALL DispRegs
MOV ECX,01 ;EAX Display
MOV ESI,OFFSET DbgTxt01
MOV EAX,[EBX.TSS_EAX]
CALL DispRegs
MOV ECX,02 ;EBX Display
MOV ESI,OFFSET DbgTxt02
MOV EAX,[EBX.TSS_EBX]
CALL DispRegs
MOV ECX,03 ;ECX Display
MOV ESI,OFFSET DbgTxt03
MOV EAX,[EBX.TSS_ECX]
CALL DispRegs
MOV ECX,04 ;EDX Display
MOV ESI,OFFSET DbgTxt04
MOV EAX,[EBX.TSS_EDX]
CALL DispRegs
MOV ECX,05 ;ESI Display
MOV ESI,OFFSET DbgTxt05
MOV EAX,[EBX.TSS_ESI]
CALL DispRegs
MOV ECX,06 ;EDI Display
MOV ESI,OFFSET DbgTxt06
MOV EAX,[EBX.TSS_EDI]
CALL DispRegs
MOV ECX,07 ;EBP Display
MOV ESI,OFFSET DbgTxt07
MOV EAX,[EBX.TSS_EBP]
CALL DispRegs
MOV ECX,08 ;SS Display
MOV ESI,OFFSET DbgTxt08
XOR EAX,EAX
MOV AX,[EBX.TSS_SS]
CALL DispRegs
MOV ECX,09 ;ESP Display
MOV ESI,OFFSET DbgTxt09
MOV EAX,[EBX.TSS_ESP]
CALL DispRegs
MOV ECX,10 ;CS Display
MOV ESI,OFFSET DbgTxt10
XOR EAX,EAX
MOV AX,[EBX.TSS_CS]
CALL DispRegs
MOV ECX,11 ;EIP Display
MOV ESI,OFFSET DbgTxt11
MOV EAX,[EBX.TSS_EIP]
CALL DispRegs
MOV ECX,12 ;DS Display
MOV ESI,OFFSET DbgTxt12
XOR EAX,EAX
MOV AX,[EBX.TSS_DS]
CALL DispRegs
MOV ECX,13 ;ES Display
MOV ESI,OFFSET DbgTxt13
XOR EAX,EAX
MOV AX,[EBX.TSS_ES]
CALL DispRegs
MOV ECX,14 ;FS Display
MOV ESI,OFFSET DbgTxt14
XOR EAX,EAX
MOV AX,[EBX.TSS_FS]
CALL DispRegs
MOV ECX,15 ;GS Display
MOV ESI,OFFSET DbgTxt15
XOR EAX,EAX
MOV AX,[EBX.TSS_GS]
CALL DispRegs
MOV ECX,16 ;EFlags Display
MOV ESI,OFFSET DbgTxt16
MOV EAX,[EBX.TSS_EFlags]
CALL DispRegs
MOV ECX,17 ;CR0 Display
MOV ESI,OFFSET DbgTxt17
MOV EAX,CR0
CALL DispRegs
MOV ECX,18 ;CR2 Display
MOV ESI,OFFSET DbgTxt18
MOV EAX,CR2
CALL DispRegs
MOV ECX,19 ;CR3 Display
MOV ESI,OFFSET DbgTxt19
MOV EAX,CR3
CALL DispRegs
MOV ECX,20 ;Fault Error Code Display
MOV ESI,OFFSET DbgTxt20
MOV EAX,dbgFltErc
CALL DispRegs
RETN
;=============================================================================
;
; This is for Debugger Register display
; Call with: EAX loaded with value to display (from TSS reg)
; ECX loaded with number of text line to display on
; ESI loaded with EA of text line to display
; We save all registers cause the vid calls don't
;=============================================================================
DispRegs:
PUSHAD
PUSH EAX ;Save number to display
PUSH 66
PUSH ECX
CALL FAR PTR _SetXY
PUSH ESI
PUSH 05h
PUSH 07h
CALL FAR PTR _TTYOut
POP EAX ;Get number back for display
PUSH EAX
PUSH OFFSET dbgBuf
CALL DDtoHex
PUSH OFFSET dbgBuf
PUSH 8
PUSH 07h
CALL FAR PTR _TTYOut
POPAD
RETN
;===========================
dbgDispMenu:
PUSH 0 ;Display Debugger FKey Menu
PUSH 24
CALL FAR PTR _SetXY
LEA EAX,dbgMenu
PUSH EAX
PUSH 78
PUSH 70h
CALL FAR PTR _TTYOut
PUSH 25
PUSH 24
CALL FAR PTR _SetXY
LEA EAX,dbgSpace
PUSH EAX
PUSH 1
PUSH 07h
CALL FAR PTR _TTYOut
PUSH 51
PUSH 24
CALL FAR PTR _SetXY
LEA EAX,dbgSpace
PUSH EAX
PUSH 1
PUSH 07h
CALL FAR PTR _TTYOut
RETN
;===========================
dbgSetAddr:
PUSH 0 ;Goto Query Line
PUSH 23 ;
CALL FAR PTR _SetXY
LEA EAX, dbgTxtAddr
PUSH EAX
PUSH 16
PUSH 07h
CALL FAR PTR _TTYOut
CMP EAX, 0
JNE DumpDone
LEA EAX, DbgBuf2 ;
PUSH EAX ;pEdString
PUSH cbBufLen2 ;Crnt size
PUSH 8 ;Max size
LEA EAX, cbBufLen2 ;
PUSH EAX ;ptr to size returned
LEA EAX, dbgChar ;
PUSH EAX ;ptr to char returned
PUSH 70h ;Black On White
CALL FAR PTR _EditLine ;Ignore error if any
MOV AL, dbgChar ;did they exit with CR?
CMP AL, 0Dh
JNE dbgSetAddrDone
LEA EAX, dbgBuf2 ;Convert String to DD
PUSH EAX ;ptr to string
LEA EAX, dbgNextAdd
PUSH EAX ;ptr to destination DD
PUSH cbBufLen2 ;length of string
CALL HexToDD ;dbgDumpAdd has address to dump!
CMP EAX, 0
JNE dbgSetAddrDone
MOV EAX, dbgNextAdd
MOV NextEIP, EAX
dbgSetAddrDone:
CALL dbgClearQuery
RETN ;Go home...
;===========================
dbgDump:
PUSH 0 ;Goto Query Line
PUSH 23 ;
CALL FAR PTR _SetXY
LEA EAX, dbgTxtAddr
PUSH EAX
PUSH 16
PUSH 07h
CALL FAR PTR _TTYOut
CMP EAX, 0
JNE DumpDone
LEA EAX, DbgBuf2 ;
PUSH EAX ;pEdString
PUSH cbBufLen2 ;Crnt size
PUSH 8 ;Max size
LEA EAX, cbBufLen2 ;
PUSH EAX ;ptr to size returned
LEA EAX, dbgChar ;
PUSH EAX ;ptr to char returned
PUSH 70h ;Black On White
CALL FAR PTR _EditLine ;Ignore error if any
MOV AL, dbgChar ;did they exit with CR?
CMP AL, 0Dh
JE dbgDoDump
CALL dbgClearQuery
RETN ;Go home...
dbgDoDump:
LEA EAX, dbgBuf2 ;Convert String to DD
PUSH EAX ;ptr to string
LEA EAX, dbgDumpAdd
PUSH EAX ;ptr to destination DD
PUSH cbBufLen2 ;length of string
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -