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 + -
显示快捷键?