2020-09-30 17:17:25 +02:00

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