Zespół: PT/17/TP Wrocław, 21.05.2010
Elżbieta Tchorowska, 171067
Konrad Kukulski, 163930
Ocena:
Oddano:
Tryb chroniony w emulatorze DOS pod platformą Linux
Sprawozdanie z laboratorium z przedmiotu „Architektura Komputerów”
Rok. Akadem. 2009/2010, Kierunek: INF
PROWADZĄCY:
Mgr inż. Mariusz Czapski
Spis treści:
Cel ćwiczenia
Celem ćwiczenia było zapoznanie się z trybem chronionym. Ponieważ w systemie Linux wywołanie trybu jest niemożliwe, korzystaliśmy z emulatora systemu DOS - DosBox. Wg polecenia należało uruchomić tryb chroniony na podstawie podanego przez prowadzącego kodu źródłowego, który zawierał błędy. Należało je poprawić i dopisać funkcję, która w trybie chronionym wypisałaby na ekran pierwsze litery imion członków grupy laboratoryjnej.
Przebieg ćwiczenia
Uruchomienie emulatora DosBox polegało na zamontowaniu dysku fizycznego pod dyskiem wirtualnym i wywołanie kompilatora systemu Dos. Pierwsza kompilacja, tak jak się spodziewano nie powiodła się z powodu błędów. Większość z nich okazała się literówkami. Źle napisano nazwę funkcji enable_20 i disable_20.
Program
Sam program, już bez błędów kompilatora, wyglądał następująco:
Napis
Kolejnym krokiem programu miało być wyświetlenie inicjałów członków grupy.
Napis - kod as
Wnioski
Przełączenie w tryb chroniony zadziałało poprawnie. Napis z karty graficznej „ETKK” wyświetlał się poprawnie.
Strona 6 z 6
ENDP enable_a20
disable_20 PROC NEAR
mov al, A20_PORT
out STATUS_PORT, al
mov al, A20_OFF
out KBD_PORT_A, al
ret
ENDP disable_a20
SSEG SEGMENT WORD STACK USE16 'STACK'
DB 1024 DUP (?)
SSEG ENDS
END STARTPOINT
END
code32 segment para public use32 //użycie 32-bitów
assume cs:code32, ds:code32
napis db 'ETKK' //etykieta i napis
start32:
mov edx, offset napis
mov ecx, 4 //ilość znaków napisu
call write
petla_inf: //wywołanie funkcji napis
jmp petla_inf
write PROC
mov ebx,0
petla:
mov al, byte ptr [edx] //offset do pierwszego
mov byte ptr [0b8000h+ebx], al // znaku napis ++
inc ebx
inc ebx
inc edx
loop petla
ret
GoProtect PROC
call enable_a20
mov ax, SEG _DATA
mov dl, ah
shl ax, 4
shr dl, 4
sub dh, dh
add ax, OFFSET GblDT
adc dl, 0
mov GblDscTbl+2, ax
mov GblDscTbl+4, dx
lgdt PWORD PTR GblDscTbl
cli
smsw ax
and ax, 1Fh
or ax, 1
lmsw ax
DB 0EAh
DW ClearPF
DW 10h
ClearPF:
mov ax, 8
mov ds, ax
mov ax, 18h
mov ss, ax
ret
GoProtect ENDP
GoReal PROC
mov eax, CR0
and eax, 07FFFFFFEh
mov CR0, eax
DB 0EAh
DW ClearPF2
DW _TEXT
ClearPF2:
mov ax, SEG DGROUP
mov ds, ax
mov ax, SEG SSEG
mov ss, ax
sti
call disable_a20
ret
GoReal ENDP
enable_20 PROC NEAR
mov al, A20_PORT
out STATUS_PORT, al
mov al, A20_ON
out KBD_PORT_A, al
ret
Start PROC
mov ax, SEG _DATA
mov ds, ax
mov si, OFFSET GblDT
add si, 8
mov bx, 0FFFFh
mov cx, RDWRDATA
call SetDscrpt
mov ax, SEG _TEXT
add si, 8
mov bx, 0FFFFh
mov cx, EXECUT
call SetDscrpt
mov ax, SEG SSEG
add si, 8
mov bx, 0FFFFh
mov cx, EXECUT
call SetDscrpt
mov ax, 0a000h
add si, 8
mov bx, 0FFFFh
mov cx, RDWRDATA
call SetDscrpt
mov ax, 13h
int 10h
call GoProtect
call GoReal
mov ah, 4Ch
int 21h
Start ENDP
SetDscrpt PROC
mov dl, ah
shl ax, 4
shr dl, 4
mov WORD PTR [si], bx
mov WORD PTR [si+2], ax
mov BYTE PTR [si+4], dl
mov WORD PTR [si+5], cx
mov BYTE PTR [si+7], 0
ret
SetDscrpt ENDP
write ENDP //wywołanie funkcji napis
code32 ends
END STARTPOINT
END
.MODEL SMALL
.386
.DATA
EXECUT EQU 10011010b
RDWRDATA EQU 10010010b
STACKSEG EQU 10010110b
STATUS_PORT EQU 64
A20_PORT EQU 0d1h
A20_ON EQU 0dfh
A20_OFF EQU 0ddh
KBD_PORT_A EQU 60
GblDT DW 0, 0, 0, 0
DW 0, 0, 0, 0
DW 0, 0, 0, 0
DW 0, 0, 0, 0
GblDscTbl DW 4 * 8 - 1
DD 0
.CODE
STARTPOINT: