- •Лабораторная работа №1
- •Лабораторная работа №2
- •Лабораторная работа №4 Изучение команд «Сервис – Монитора»
- •Лабораторная работа №5 Переключение микропроцессора в защищенный режим
- •Методические указания Простая программа переключения режима мп
- •Изменения в коде программы
- •Лабораторная работа №6
- •Результаты и вывод
Изменения в коде программы
P286
bios_data_seg SEGMENT at 0040h
ORG 0067h
io_rom_init dw ?
io_rom_seg dw ?
bios_data_seg ENDS
descriptor STRUC
seg_limit dw 0
base_lo_word dw 0
base_hi_byte db 0
access_rights db 0
dw 0
descriptor ENDS
cmos_port equ 070h
code_seg_access equ 10011010b
data_seg_access equ 11110010b
disable_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 + 0000000000000000b
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 + 0000000000000000b
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 + 0000000000000000b
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 + 0000000000000000b
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 + 0000000000000000b
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 + 0000000000000000b
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
Результат: программа осуществит переход в защищенный режим, что будет показано графическими символами и звуковыми тонами; на экране также будет фамилия студента, его курс и группа.
Выполнил: |
|
|
Проверил: |
Гурчин И.И. |
|