⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vbare.asm

📁 windows汇编语言程序设计 吴中平著 一书所附所有源代码。 该书重点讲解了Windows环境下汇编语言程序设计的基本原理及其实现过程
💻 ASM
📖 第 1 页 / 共 2 页
字号:
assume cs:DosCodeSeg,ds:DATA_SEG,ss:DosStackSeg
Input:
     pushad
     push ds
     push es
     push fs
     push gs
     mov ax,NORMAL_SEL
     mov ss,ax
mov sp,ax
     mov eax,cr0
     and eax,0fffffffeh
     mov cr0,eax
     jmp_16 <seg dos_int>,<offset dos_int>
dos_int:
     mov ax,DATA_SEG
     mov ds,ax
     LSS sp,dword ptr Sp_Value
     LIDT  RealIdtr
     sti
     mov ah,6
     mov al,0
     mov bh,0;f & b Color
     mov cx,0
     mov dx,184fh
     int 10h     ;clear screen
     mov ax,MainDataSeg
     mov es,ax
     mov ds,ax
     lea  bp,ExtMemMess
     mov dx,0h
     mov bh,0
     mov cx,EMM_LEN+48
     mov ah,13h
     mov al,1
     mov bl,034h
     int 10H
     cli
     mov ax,DATA_SEG
     mov ds,ax
     LIDT qword ptr V_Idtr
     mov eax,CR0
     or eax,1
     mov CR0,eax
    JMP_16 < DOSCODE_SEL>,<offset Dos_V>
Dos_V:
     mov ax,DOSSTACK_SEL
     mov ss,ax
     pop gs
     pop fs
     pop es
     pop ds
     popad
     IRETD
     jmp Input
     DOSCODELENGTH=$
DosCodeSeg Ends



DosTSSSeg Segment para use16
    dd 0
    dd ?
    dw ?,0
    dd ?
    dw ?,0
    dd ?
    dw ?,0
    dd 0
    dw Input,0
    dd 0
    dd 0
    dd 0
    dd 0
    dd 0
    dw DOSSTACKLENGTH,0
    dd 0
    dd 0
    dd 0
    dw NORMAL_SEL,0     ;es
    dw DOSCODE_SEL,0   ;cs
    dw DOSSTACK_SEL,0  ;ss
    dw NORMAL_SEL,0    ;ds
    dw NORMAL_SEL,0    ;fs
    dw NORMAL_SEL,0    ;gs
    dw DOSLDT_SEL,0    ;ldt
    dw 0
    dw $+2
    db 0ffh
DOSTSSLENGTH=$
DosTSSSeg Ends

ControlSeg Segment PARA use16
assume cs:ControlSeg
VirtualEntry:
;===================================================================

     mov ax,MAINTSS_ALIAS_SEL
     mov fs,ax
     mov dword ptr fs:Main_Tss.tresp0,MAINSTACK_POINTER_0
     mov  fs:Main_Tss.trss0,MAINSTACK_0_SEL
     mov dword ptr fs:Main_Tss.tresp2,MAINSTACK_POINTER_2
     mov  fs:Main_Tss.trss2,MAINSTACK_2_SEL
     mov  fs:Main_Tss.trldt,MAINLDT_SEL
     mov ax,MAINDATA_SEL
     mov ds,ax
     mov ax,ECHO_BUFFER_SEL
     mov es,ax
     mov gs,ax
     mov ax,MAINSTACK_0_SEL
     mov ss,ax
     mov esp,MAINSTACK_POINTER_0
     mov ax,MAINTSS_SEL
     ltr ax
     mov ax,MAINLDT_SEL
     lldt ax


;-------------------------------------------------------------------
;===================================================================
          
     Call_16 VISITEXMEM_SEL,GetExMem
     int 21h
;-------------------------------------------------------------------
;===================================================================
          
     push MAINSTACK_2_SEL
     push MAINSTACK_POINTER_2
     push  LEVEL2_SEL
     push offset Level2
     retf
ReturnLevel_0_Entry:
     pop ebx;level2 eip
     pop ebx;level2 32bit cs
     pop edx;12345678H
     mov ax,MAINDATA_SEL
     mov es,ax
     lea di,Buffer_DPL
     mov cx,4
toa_c:
     rol edx,8
     mov al,dl
     Call_16 MAINCODE_SEL,ToAscii
     stosw
     loop toa_c
     mov ax,MAINDATA_SEL
     mov ds,ax
     lea si,DPLConvert
     mov ax,ECHO_BUFFER_SEL
     mov es,ax
     mov di,160*3
     mov cx,DPL_LEN
     call_16 MAINCODE_SEL,Dis_play
     mov di,160*4
     mov cx,8
     lea si,Buffer_DPL
     mov cx,8
     call_16 MAINCODE_SEL,Dis_play
;-------------------------------------------------------------------

;===================================================================
          
     mov ax,EXTMEM_SEL
     mov ds,ax
     mov dword ptr ds:[0],0
;-------------------------------------------------------------------

;===================================================================
          
     INT 0FFH    
;-------------------------------------------------------------------

;===================================================================
          
     mov ax,MAINDATA_SEL
     mov ds,ax
     lea si,PageManage
     mov ax,ECHO_BUFFER_SEL
     mov es,ax
     mov di,160*10
     mov cx,PAGE_LEN
     call_16 MAINCODE_SEL,Dis_play
     INT 0FEH
;-------------------------------------------------------------------


ToReal:
     mov ax,NORMAL_SEL
     mov ds,ax
     mov es,ax
     mov fs,ax
     mov gs,ax
     mov ss,ax
     mov eax,cr0
     and eax,0fffeh
     mov cr0,eax
     jmp FAR ptr ToDos
ControlSeg Ends

DATA_SEG Segment para use16
     V_Gdtr    G_IDC <GDTLENGTH-1,>
     V_Idtr    G_IDC <IDTLENGTH-1,>
     RealIdtr  G_IDC <3FFH,0>
     Sp_Value  dw ?
     Ss_Value  dw ?
DATA_SEG Ends

CODE_SEG Segment para use16
     assume ds:DATA_SEG,CS:CODE_SEG
start:
     mov ax,DATA_SEG
     mov ds,ax
     cld
     push ds
     call Init_Gdt
     call Init_Idt
assume ds:MainLDTSeg
     mov ax,MainLDTSeg
     mov ds,ax
     lea si,MainLDT_Init_Start
     mov cx,MAINLDT_INIT_NUM
     call Init_Ldt
assume ds:DosLDTSeg
     mov ax,DosLDTSeg
     mov ds,ax
     mov cx,DOSLDT_INIT_NUM
     lea si,DosLDT_Init_Start
     call Init_Ldt
     pop ds
assume ds:data_seg
     mov Sp_Value,sp
     mov Ss_Value,ss
     LGDT V_Gdtr;GDTR
     SIDT RealIdtr
     cli
     LIDT V_Idtr;IDTR
     call     Enabled_A20
     mov eax,CR0
     or eax,1
     mov CR0,eax
    JMP_16 <SWITCH_SEL>,<offset VirtualEntry>

ToDos:
     call Disabled_A20
     mov ax,DATA_SEG
     mov ds,ax 
     lss sp,dword ptr Sp_Value
     LIDT RealIdtr
     sti
     mov ax,DosDataSeg
     mov es,ax
     lea bp,DosMess
     mov dx,1700H
     mov bh,0
     mov cx,DOSMESSLEN
     mov al,0
     mov bl,0d2h
     mov ah,13h
     int 10h     
     mov ah,0
     int 16h
     mov ah,6
     mov al,0
     mov bh,7;f & b Color
     mov cx,0
     mov dx,184fh
     int 10h     
     mov ax,4c00h
     int 21h

Init_Gdt proc near
     push ds
assume ds:GDTSEG
     mov ax,GDTSEG
     mov ds,ax
     mov cx,GDT_INIT_NUM
     lea si,Gdt_Init_Start
repseg_gdt:
     mov ax,[si].basel
     mov bx,16
     mul bx   
     mov [si].basel,ax
     mov [si].basem,dl
     mov [si].baseh,dh
     add si,size DESCRIPTOR
     loop repseg_gdt
assume ds:data_seg
     pop ds
     mov bx,16
     mov ax,GDTSEG
     mul bx
     mov word ptr V_Gdtr.base,ax
     mov word ptr V_Gdtr.base+2,dx
     ret
Init_Gdt endp

Init_Ldt proc near
repseg_ldt:
     mov ax,[si].basel
     mov bx,16
     mul bx
     mov [si].basel,ax
     mov [si].basem,dl
     mov [si].baseh,dh
     add si,size descriptor
     loop repseg_ldt
     ret
Init_Ldt endp

Init_Idt proc    near
     mov ax,IDTSEG
     mov  bx,16
     mul bx
     mov word ptr V_Idtr.base,ax
     mov word ptr V_Idtr.base+2,dx
     ret
Init_Idt Endp


Enabled_A20 proc near
     push ax
     in al,92h
     or al,2
     out 92h,al
     pop ax
     ret
Enabled_A20 endp

Disabled_A20 proc
     push ax
     in al,92h
     and al,0fdh
     out 92h,al
     pop ax
     ret
Disabled_A20 endp
CODE_SEG ends
     end start

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -