Architektura_komputerów_la6_PT17_TP_Kukulski_Tchorowska.doc

(69 KB) Pobierz
Architektura komputerów

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              2

Przebieg ćwiczenia              2

Program              2

Napis              5

Napis – kod as              5

Wnioski              6

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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:

.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:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Napis

 

Kolejnym krokiem programu miało być wyświetlenie inicjałów członków grupy.

 

Napis – kod as

 

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

                            ...

Zgłoś jeśli naruszono regulamin