Скачиваний:
118
Добавлен:
01.05.2014
Размер:
62.46 Кб
Скачать

Санкт-Петербургский электротехнический университет имени В. И. Ульянова (Ленина)

Кафедра МО ЭВМ

Операционные системы

Отчет по лабораторной работе №1

" Определение типа ПК и версии DOS"

Преподаватель:

Студент группы 4351: Усенко Александр Владимирович

Санкт-Петербург

2006 г.

Цель работы: получение навыков программирования модуля типа .COM и изучения функций, определяющих тип ПК и версию DOS.

Постановка задачи

Написать на языке Ассемблер программу, выводящую на экран тип IBM PC, версию MS-DOS, серийный номер OEM (Original Equipment Manufacturer) и 24-битовый серийный номер пользователя.

Программа должна быть оформлена как загрузочный модуль типа .COM. Программа должна выводить на экран символьный код типа ПЭВМ, номер основной версии (X) и номер модификации (YY) должны выводится в виде десятичного числа в формате X.YY.

Необходимые сведения

Тип IBM PC хранится в байте по адресу 0F000:0FFFE, в предпоследнем байте ROM BIOS. Соответствие кода и типа:

PC FF

PC/XT FE,FB

AT FC

PS2 модель 30 FA

PS2 модель 50 или 60 FC

PS2 модель 80 F8

PCjr FD

PC Convertible F9

Ассемблерная программа должна читать содержимое этого байта, переводить двоичный код в символьную строку, содержащую запись шестнадцатиричного числа и выводить на экран эту строку.

Для определения версии MS DOS следует воспользоваться функцией 30H прерывания 21H. Входным параметром является номер функции в AH:

MOV AH,30h

INT 21h

Выходными параметрами являются:

AL - номер основной версии. Если 0, то < 2.0

AH - номер модификации

BH - серийный номер OEM (Original Equipment Manufacturer)

BL:CX - 24-битовый серийный номер пользователя.

Описание программы и текст исходного модуля

В программе используются следующие процедуры:

TETR_TO_HEX

Перевод десятичной цифры в код символа

BYTE_TO_HEX

Перевод байта в 16-ной с/с в символьный код

WRD_TO_HEX

Перевод слова в 16-ной с/с в символьный код

BYTE_TO_DEC

Перевод байта в 16-ной с/с в символьный код в 10-ной с/с

WriteMsg

Вывод строки на экран

PCTYPE

Определение типа PC

MSDOS_VER_DET

Определение версии MS-DOS

OEM_NUM_DET

Определение номера OEM

USER_NUM_DET

Определение номера пользователя

Текст исходного модуля

CODESEG SEGMENT

ASSUME CS:CODESEG, DS:CODESEG, ES:NOTHING, SS:NOTHING

ORG 100H

START: JMP BEGIN

; ДАННЫЕ

TYPE_PC db 'Тип IBM PC: ',0DH,0AH,'$'

MSDOS_VER db 'Версия MS-DOS: . ',0DH,0AH,'$'

OEM_NUM db 'Серийный номер OEM: ',0DH,0AH,'$'

USER_NUM db 'Серийный номер пользователя: H',0DH,0AH,'$'

;ПРОЦЕДУРЫ

; Процедура печати строки

WriteMsg PROC NEAR

mov AH,09h

int 21h ; Вызов функции DOS по прерыванию

ret

WriteMsg ENDP

;-----------------------------------------------------

TETR_TO_HEX PROC near

and AL,0Fh

cmp AL,09

jbe NEXT

add AL,07

NEXT: add AL,30h

ret

TETR_TO_HEX ENDP

;-------------------------------

BYTE_TO_HEX PROC near

; байт в AL переводится в два символа шестн. числа в AX

push CX

mov AH,AL

call TETR_TO_HEX

xchg AL,AH

mov CL,4

shr AL,CL

call TETR_TO_HEX ;в AL старшая цифра

pop CX ;в AH младшая

ret

BYTE_TO_HEX ENDP

;-------------------------------

WRD_TO_HEX PROC near

;перевод в 16 с/с 16-ти разрядного числа

; в AX - число, DI - адрес последнего символа

push BX

mov BH,AH

call BYTE_TO_HEX

mov [DI],AH

dec DI

mov [DI],AL

dec DI

mov AL,BH

call BYTE_TO_HEX

mov [DI],AH

dec DI

mov [DI],AL

pop BX

ret

WRD_TO_HEX ENDP

;--------------------------------------------------

BYTE_TO_DEC PROC near

; перевод байта в 10с/с, SI - адрес поля младшей цифры

; AL содержит исходный байт

push AX

push CX

push DX

xor AH,AH

xor DX,DX

mov CX,10

loop_bd: div CX

or DL,30h

mov [SI],DL

dec SI

xor DX,DX

cmp AX,10

jae loop_bd

cmp AL,00h

je end_l

or AL,30h

mov [SI],AL

end_l: pop DX

pop CX

pop AX

ret

BYTE_TO_DEC ENDP

;-------------------------------

; Процедура определения типа PC

PCTYPE PROC NEAR

push AX

push BX

push DX

push ES

mov BX,0F000H

mov ES,BX

mov AL,ES:[0FFFEH]

call BYTE_TO_HEX

lea BX,TYPE_PC

mov [BX+12],AX

pop ES

pop DX

pop BX

pop AX

ret

PCTYPE ENDP

; Процедура определения версии MS-DOS

MSDOS_VER_DET PROC NEAR

push AX

push SI

lea SI,MSDOS_VER

add SI,16

call BYTE_TO_DEC

lea SI,MSDOS_VER

add SI,19

mov AL,AH

call BYTE_TO_DEC

pop SI

pop AX

ret

MSDOS_VER_DET ENDP

; Процедура определения номера OEM

OEM_NUM_DET PROC NEAR

push AX

push BX

push SI

mov AL,BH

lea SI,OEM_NUM

add SI,22

call BYTE_TO_DEC

pop SI

pop BX

pop AX

ret

OEM_NUM_DET ENDP

; Процедура определения номера пользователя

USER_NUM_DET PROC NEAR

push AX

push BX

push CX

push DI

mov AX,CX

lea DI,USER_NUM

add DI,36

call WRD_TO_HEX

mov AL,BL

call BYTE_TO_HEX

lea DI,USER_NUM

add DI,31

mov [DI],AX

pop DI

pop CX

pop BX

pop AX

ret

USER_NUM_DET ENDP

; КОД

BEGIN:

call PCTYPE

mov AH,30H

INT 21H

call MSDOS_VER_DET

call OEM_NUM_DET

call USER_NUM_DET

; Вывод версии PC

lea DX,TYPE_PC

call WriteMsg

; Вывод версии MS-DOS

lea DX,MSDOS_VER

call WriteMsg

; Вывод номена OEM

lea DX,OEM_NUM

call WriteMsg

; Вывод номера пользователя

lea DX,USER_NUM

call WriteMsg

; Выход в DOS

xor AL,AL

mov AH,4Ch

int 21H

CODESEG ENDS

END START ;конец модуля, START - точка входа

Результаты работы программы

Тип IBM PC: FC

Версия MS-DOS: 5. 0

Серийный номер OEM: 255

Серийный номер пользователя: 000000H

Ответы на контрольные вопросы

1. Перечислите требования, которым должен удовлетворять исходный модуль на ассемблере, если по нему должен быть построен загрузочный модуль .COM.

- COM-файл ограничен размером одного сегмента и не превышает 64К. COM-файл всегда меньше, чем соответствую щий EXE-файл; одна из причин этого - отсутствие в COM-файле 512-байтового начального блока EXE-файла.

- COM-программа генерирует стек автоматически. Таким образом при создании ассемблерной программы, которая будет преобразована в COM-файл, стек должен быть опущен.

- В COM-программе все данные должны быть определены в сегменте кода.

- В начале программы необходимо зарезервировать место для PSP размером 100H, добавив директиву ORG 100H

2. Как хранится загрузочный модуль типа .COM на диске?

.com-файл (copy of memory) на диске лежит практически в таком же виде, в котором он будет существовать в памяти после загрузки, на диске не хранится только PSP.

3. Какие значения получают регистры при загрузке модуля типа .COM?

Для COM-файла DOS автоматически определяет стек и устанав ливает oдинаковый общий сегментный адрес во всех четырех сегментных pегистрах (CS, DS, SS, ES) – инициализирует их адресом PSP. Если для программы размер сегмента в 64К является достаточным, то DOS устанавливает в регистре SP адрес конца cегмента - шест.FFFE. Это будет верх стека. Если 64К байтовый сегмент не имеет достаточно места для стека, то DOS устанавливает стек в конце памяти. В обоих случаях DOS записывает затем в стек нулевое слово.

Соседние файлы в папке Лабораторная работа 1
  • #
    01.05.20144.11 Кб129lab_1.asm
  • #
    01.05.2014363 б77LAB_1.com
  • #
    01.05.2014631 б66LAB_1.OBJ
  • #
    01.05.201462.46 Кб118LR_1.doc