Лабораторная работа 1 / LR_1
.docСанкт-Петербургский электротехнический университет имени В. И. Ульянова (Ленина)
Кафедра МО ЭВМ
Операционные системы
Отчет по лабораторной работе №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 записывает затем в стек нулевое слово.