93 lines
1.8 KiB
NASM
93 lines
1.8 KiB
NASM
title "Debug registers"
|
|
.486p
|
|
.xlist
|
|
include ks386.inc
|
|
include callconv.inc
|
|
.list
|
|
|
|
_TEXT SEGMENT PARA PUBLIC 'CODE'
|
|
ASSUME DS:FLAT, ES:FLAT, SS:NOTHING, FS:NOTHING, GS:NOTHING
|
|
|
|
page , 132
|
|
subttl "Debug registers"
|
|
|
|
;++
|
|
;
|
|
; SetDreg
|
|
;
|
|
; Set up dr0-dr3 and dr7 for hardware breakpoints
|
|
;
|
|
;--
|
|
cPublicProc _SetDreg, 5
|
|
cPublicFpo 0,0
|
|
; don't want to be bothered while we're setting this stuff up
|
|
pushfd
|
|
cli
|
|
mov ecx, [esp+8]
|
|
; First set up a mask to clear out dr7
|
|
shl ecx, 1
|
|
mov eax, 0f0003h
|
|
shl eax, cl
|
|
not eax
|
|
mov edx, dr7
|
|
and eax, edx
|
|
xor edx, edx
|
|
mov dr7, eax
|
|
mov dr6, edx
|
|
; If we're disabling the breakpoint, we're done now
|
|
mov dl, [esp+24]
|
|
shr ecx, 1
|
|
test edx, edx
|
|
jz sd10
|
|
; Set the appropriate dreg
|
|
test ecx, ecx
|
|
mov eax, [esp+12]
|
|
jnz cl0
|
|
mov dr0, eax
|
|
jmp sd1
|
|
cl0:
|
|
dec ecx
|
|
jnz cl1
|
|
mov dr1, eax
|
|
jmp sd1
|
|
cl1:
|
|
dec ecx
|
|
jnz cl2
|
|
mov dr2, eax
|
|
jmp sd1
|
|
cl2:
|
|
dec ecx
|
|
jnz reg3
|
|
mov dr3, eax
|
|
sd1:
|
|
; now construct the thing we actually shift into dr7
|
|
xor edx, edx
|
|
mov dl, [esp+20]
|
|
shl edx, 2
|
|
mov ecx, [esp+8]
|
|
or dl, [esp+16]
|
|
shl ecx, 1
|
|
shl edx, 16
|
|
or edx, 3
|
|
mov eax, dr7
|
|
shl edx, cl
|
|
or edx, eax
|
|
mov dr7, edx
|
|
; and now we're done
|
|
sd10:
|
|
popfd
|
|
ret 14h
|
|
reg3:
|
|
int 3
|
|
jmp sd10
|
|
stdENDP _SetDreg
|
|
|
|
cPublicFastCall DwExchangeDr6, 1
|
|
mov eax, dr6
|
|
mov dr6, ecx
|
|
fstRET DwExchangeDr6
|
|
fstENDP DwExchangeDr6
|
|
|
|
_TEXT ends
|
|
end
|