Data_seg_access equ 11110010bdisable_bit20 equ 11011101b enable_bit20 equ 11011111b inta01 equ 021h intb01 equ 0a1h port_a equ 060h shut_cmd equ 0feh shut_down equ 00fh status_port equ 064h virtual_enable equ 0001h ton1 equ 4f38h ton2 equ 0f38h lgdt MACRO gdt1 db 00fh db 001H db 016h dw offset gdt1 ENDM sgdt MACRO reggdt db 00fh db 001h db 006h dw offset reggdt ENDM lmsw MACRO lmsw1 db 00FH db 001h db 0F0h ENDM jumpfar MACRO jumpfar1,jumpfar2 db 0EAh dw offset jumpfar1 dw jumpfar2 ENDM cseg SEGMENT para public 'code' ASSUME cs:cseg ORG 100h start: jmp main EVEN gdt LABEL byte dummy db 0,0,0,0,0,0,0,0 ddt_desc EQU (($-gdt)/8)*8 + 00000000000000 00 b gdt1 dw gdt_leng base_lo_word_1 dw 0 base_hi_byte_1 db 0 db data_seg_access db 0,0 cs_code EQU (($-gdt)/8)*8 + 00000000000000 00 b gdt2 dw cseg_leng base_lo_word_2 dw 0 base_hi_byte_2 db 0 db code_seg_access db 0,0 cs_data EQU (($-gdt)/8)*8 + 00000000000000 00 b gdt3 dw cseg_leng base_lo_word_3 dw 0 base_hi_byte_3 db 0 db data_seg_access db 0,0 ss_desc EQU (($-gdt)/8)*8 + 00000000000000 00 b gdt4 dw 0FFFFh base_lo_word_4 dw 0 base_hi_byte_4 db 0 db data_seg_access db 0,0 ds_desc equ (($-gdt)/8)*8 + 00000000000000 00 b gdt5 dw 0FFFFh base_lo_word_5 dw 0 base_hi_byte_5 db 0 db data_seg_access db 0,0 es_desc equ (($-gdt)/8)*8 + 00000000000000 00 b gdt6 dw 0FFFFh base_lo_word_6 dw 0 base_hi_byte_6 db 0 db data_seg_access db 0,0 gdt_leng EQU $-gdt-1 PAGE i8259_1 db? i8259_2 db? ; MAIN: ASSUME ds:cseg main PROC cld mov dx,cs mov cx,offset gdt call form_24bit_address mov base_lo_word_1,dx mov base_hi_byte_1,cl mov dx,cs xor cx,cx call form_24bit_address mov base_lo_word_2,dx mov base_hi_byte_2,cl mov base_lo_word_3,dx mov base_hi_byte_3,cl mov dx,ss xor cx,cx call form_24bit_address mov base_lo_word_4,dx mov base_hi_byte_4,cl lgdt gdt1 mov ah,enable_bit20 call gate_a20 or al,al jz m_10 mov dx,offset gate_failure mov ah,9 int 21h int 20h gate_failure db "Address line A20 failed to Gate open$" FIO db 'Zigunenko A. gr-2-2',10,13,'$' m_10: mov ah,9 mov dx, offset FIO int 21h cli in al,inta01 mov i8259_1,al in al,intb01 mov i8259_2,al ASSUME ds:bios_data_seg mov dx,bios_data_seg mov ds,dx mov dx,cs mov io_rom_seg,dx mov dx,offset real mov io_rom_init,dx mov al,shut_down out cmos_port,al jmp $+2 mov al,5 out cmos_port+1,al mov cx,10; m51: mov ax,0e25h; int 10h; loop m51; mov ax,virtual_enable lmsw ax jumpfar m_20,cs_code m_20: ASSUME ds:cseg mov bx,ton1 call beep mov ax,ss_desc mov ss,ax mov ax,cs_data mov ds,ax mov base_lo_word_5,8000h mov base_hi_byte_5,0Bh mov base_lo_word_6,8000h mov base_hi_byte_6,0Bh mov ax,ds_desc mov ds,ax mov ax,es_desc mov es,ax mov cx,80*25 xor si,si xor di,di m_30: lodsw mov ah,70h stosw loop m_30 mov bx,ton2 call beep mov cx,80*25 xor si,si xor di,di m_31: lodsw mov ah,07h stosw loop m_31 mov al,shut_cmd out status_port,al m_40: hlt jmp m_40 ; GATE_A20 gate_a20 PROC cli call empty_8042 jnz gate_a20_01 mov al,0d1h out status_port,al call empty_8042 jnz gate_a20_01 mov al,ah out port_a,al call empty_8042 gate_a20_01: ret gate_a20 ENDP ; EMPTY_8042 empty_8042 PROC push cx sub cx,cx empty_8042_01: in al,status_port and al,00000010b loopnz empty_8042_01 pop cx ret empty_8042 ENDP ; FORM_24BIT_ADDRESS form_24bit_address PROC push ax rol dx,4 mov ax,dx and dl,0F0h and ax,0Fh add dx,cx mov cx,ax adc cl,ch pop ax ret form_24bit_address ENDP beep PROC push ax bx cx dx di mov al,0b6h out 43h,al mov dx,14h mov ax,bx out 42h,al mov al,ah out 42h,al in al,61h mov ah,al or al,3 out 61h,al mov bx,4000 waite: mov cx,2801 spkr_on: loop spkr_on dec bx jnz waite mov al,ah out 61h,al pop di dx cx bx ax ret beep ENDP ASSUME ds:cseg real: mov dx,cs mov ds,dx mov ah,disable_bit20 call gate_a20 mov al,i8259_1 out inta01,al mov al,i8259_2 out intb01,al sti mov cx,10; m52: mov ax,0e23h; int 10h; loop m52; int 20h main ENDP cseg_leng EQU $ cseg ENDS END start
Результат: программа осуществит переход в защищенный режим, что будет показано графическими символами и звуковыми тонами; на экране также будет фамилия студента, его курс и группа.
|