drn.asm
来自「windows下汇编语言 学习汇编语言好助手」· 汇编 代码 · 共 250 行
ASM
250 行
;***************************
;文件:Drn.asm *
;功能:调试寄存器使用实例 *
;***************************
.386p
JUMP16 MACRO selector,offsetv
DB 0EAH
DW offsetv
DW selector
ENDM
;----------------------
Descriptor STRUC
limitl dw 0
basel dw 0
basem db 0
attrib dw 0
baseh db 0
Descriptor ENDS
;----------------------
Gate STRUC
offsetl dw 0
selector dw 0
dcount db 0
gtype db 0
offseth dw 0
Gate ENDS
;===============================
Data Segment use16
gdt0 Descriptor <>
DataSel = $-gdt0
DataDes Descriptor <0ffffh,,,92H,>
CodeSel = $-gdt0
CodeDes Descriptor <0ffffh,,,98H,>
VideoSel = $-gdt0
VideoDes Descriptor <0ffffh,8000H,0BH,92H,0>
Stack0Sel = $-gdt0
Stack0Des Descriptor <0,,,97H,>
IntProcSel = $-gdt0
IntProcDes Descriptor <0ffffh,,,98H,>
GdtLen = $-gdt0
GdtPtr dw GdtLen-1
dd 0
;++++++++++++++++++++++++++++++++++++++++++++++
IdtTable label byte
Off=offset IntProcBegin
REPT 256
Gate <Off,IntProcSel,0,0eeH,0>
Off=Off+(All-IntProcBegin)/256
ENDM
IdtLen = $-IdtTable
IdtPtr dw IdtLen-1
dd 0
OldIdt dw 0
dd 0
;++++++++++++++++++++++++++++++++++++++++++++++
OldSPSS dw 0,0
Mess0 db 'Break Point 0: Execute BreakPoint.',0
Mess1 db 'Break Point 1: Read/Write BreakPoint.',0
MOther db 'Other Break Point.',0
debug db ?
Data ends
;=============================================
Stack0 Segment use16
db 1024 dup (0)
Stack0 ends
;=============================================
IntProc Segment use16
assume cs:IntProc
IntProcBegin:
COUNT = 0
REPT 256
push word ptr COUNT
push ax
mov ax,offset All
jmp ax
COUNT = COUNT+1
ENDM
All:
pop ax
push bp
mov bp,sp
push ax
mov ax,[bp+2]
cmp ax,1
jz Int1Proc
ExitIntProc:
pop ax
pop bp
add sp,2
iretd
Int1Proc:
push ds
push es
pusha
mov eax,dr6
test eax,1 ;Break Point 0?
jz BP2
mov si,offset Mess0
mov di,80*2*10
call Write
mov eax,[bp+12]
or eax,10000H
mov [bp+12],eax
jmp OK
BP2:test eax,2
jz Other
mov si,offset Mess1
mov di,80*2*11
call Write
jmp OK
Other:
mov si,offset MOther
mov di,80*2*12
call Write
OK:
xor eax,eax
mov dr6,eax
popa
pop es
pop ds
jmp ExitIntProc
Write:
cld
mov ah,1eh
Load:
lodsb
cmp al,0
jz ExitWrite
stosw
jmp Load
ExitWrite:
ret
IntProc ends
;=============================================
Code segment use16
assume cs:code,ds:data
Start:
xor eax,eax ;GDT
mov ax,Data
mov ds,ax
shl eax,4
mov dword ptr [GdtPtr+2],eax
xor eax,eax ;初始化IDT
mov ax,Data
shl eax,4
add eax,offset IdtTable
mov dword ptr [IdtPtr+2],eax
xor eax,eax ;初始化数据段描述符
mov ax,Data
shl eax,4
mov DataDes.basel,ax
shr eax,16
mov DataDes.basem,al
mov DataDes.baseh,ah
xor eax,eax ;初始化代码段描述符
mov ax,Code
shl eax,4
mov CodeDes.basel,ax
shr eax,16
mov CodeDes.basem,al
mov CodeDes.baseh,ah
xor eax,eax ;初始化堆栈段描述符
mov ax,Stack0
shl eax,4
mov Stack0Des.basel,ax
shr eax,16
mov Stack0Des.basem,al
mov Stack0Des.baseh,ah
xor eax,eax ;初始化中断处理的描述符
mov ax,IntProc
shl eax,4
mov IntProcDes.basel,ax
shr eax,16
mov IntProcDes.basem,al
mov IntProcDes.baseh,ah
lgdt qword ptr GdtPtr ;Load GDT
cli
sidt qword ptr OldIdt
lidt qword ptr IdtPtr
mov OldSPSS,sp
mov [OldSPSS+2],ss
mov eax,cr0 ;转到保护模式模式
or eax,1
mov cr0,eax
JUMP16 CodeSEL,<offset Protect>
Protect:
mov ax,DataSel
mov ds,ax
mov fs,ax
mov gs,ax
mov ax,Stack0Sel
mov ss,ax
mov sp,1024
mov ax,VideoSel
mov es,ax
mov ax,Code
movzx eax,ax
shl eax,4
add eax,offset BreakPoint0
mov dr0,eax
mov ax,Data
movzx eax,ax
shl eax,4
add eax,offset Debug
mov dr1,eax
mov eax,30000Ah
mov dr7,eax
xor eax,eax
mov dr6,eax
BreakPoint0:
nop
mov al,debug
xor eax,eax
mov dr0,eax
mov dr1,eax
mov dr6,eax
mov dr7,eax
ReadyToReal:
mov eax,cr0
and eax,0fffffffeh
mov cr0,eax
JUMP16 <seg Real>,<offset Real>
Real:
mov ax,Data
mov ds,ax
mov es,ax
lss sp,dword ptr OldSPSS
lidt qword ptr OldIdt
sti
mov ax,4c00h
int 21h
Code ends
end Start
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?