Автор работы: Пользователь скрыл имя, 05 Октября 2013 в 10:05, лабораторная работа
Программа должна быть оформлена как загрузочный модуль типа .COM. Программа должна выводить на экран символьный код типа ПЭВМ, номер основной версии (X) и номер модификации (YY) должны выводится в виде десятичного числа в формате X.YY, серийный номер OEM и серийный номер пользователя.
Министерство образования Российской Федерации
Санкт-Петербургский
Государственный
Кафедра МОЭВМ
по лабораторной работе №1
Определение типа ПК и версии DOS.
Преподаватель: Губкин А.Ф. Студент гр. 7304: Монько А.О. |
Санкт-Петербург
2009
Цель Работы: получение навыков программирования модуля типа .COM и изучения функций, определяющих тип ПК и версию DOS.
Программа должна быть оформлена как загрузочный модуль типа .COM. Программа должна выводить на экран символьный код типа ПЭВМ, номер основной версии (X) и номер модификации (YY) должны выводится в виде десятичного числа в формате X.YY, серийный номер OEM и серийный номер пользователя.
______________________________
;-------------
PCInfo segment
;{
assume cs:PCInfo, ds:PCInfo, es:nothing, ss:nothing
org 100h
start: jmp short main
;тут данные:
DosVerMsg db 'DOS Version: $'
OemMsg db 'OEM: $'
SerialMsg db 'Serial Number: $'
IBMPCMsg db 'IBM PC with code: $'
CR_LF db 0dh,0ah,'$' ;знак перехода на новую строку
OutBuf db 32 dup(?) ;буфер вывода
L dw 32 ;максимальная длина буфера вывода
L_32 dd 32
ver db 0 ;номер версии X
modif db 0 ;номер модификации YY
oem db 0 ;номер OEM
serialp1 dw 0 ;серийный номер пользователя
serialp2 dw 0
main proc near
;{
.386 ; хотим 32 бита
;чтение номера версии
mov ah,30h
int 21h
mov ver,al
mov modif,ah
mov oem,bh
mov al,bl
mov serialp1, ax
mov serialp2, cx
call newLine
;вывод сообщения 'DOS Version: '
lea dx, DosVerMsg
call outputDX
;преобразование номера версии в строку
lea bx,OutBuf
mov ah,0
mov al,ver
call BIN_ASCII_32
;вывод
полученной строки после
lea dx,[bx]
call outputDX
;вывод точки
mov dl,'.'
call outCharDL
;преобразование номера
lea bx,OutBuf
mov ah,0
mov al,modif
call BIN_ASCII_32
;вывод
полученной строки после
lea dx,[bx]
call outputDX
call newLine
;вывод сообщения 'OEM: '
lea dx, OemMsg
call outputDX
;преобразование номера OEM в строку
lea bx,OutBuf
mov ah,0
mov al,oem
call BIN_ASCII_32
;вывод
полученной строки после
lea dx,[bx]
call outputDX
call newLine
;вывод сообщения 'Serial Number: '
lea dx, SerialMsg
call outputDX
;преобразование номера SN в строку
lea bx,OutBuf
mov ax,serialp1
shl eax,16
mov ax,serialp2
call BIN_ASCII_32
;вывод
полученной строки после
lea dx,[bx]
call outputDX
call newLine
;вывод сообщения 'IBM PC with code: '
lea dx, IBMPCMsg
call outputDX
;преобразование кода IBM PC в шестнадцатиричные симвлы
push ds
mov ax,0F000h
mov ds,ax
mov al,ds:0FFFEh
pop ds ; чтение байта по адресу 0F000h:0FFFEh (там хранится код типа)
call BYTE_TO_HEX
mov dl,al
call outCharDL
mov dl,ah
call outCharDL
call newLine
;выход в DOS
mov ah,4Ch
int 21h
;}
main endp
;-----------------------
outputDX proc near
;{
push ax
mov ah,9
int 21h
pop ax
ret
;}
outputDX endp
;-----------------------
;-----------------------
outCharDL proc near
;{
push ax
mov ah,2
int 21h
pop ax
ret
;}
outCharDL endp
;-----------------------
;-----------------------
newLine proc near
;{
push ax dx
lea dx, CR_LF
mov ah,9
int 21h
pop dx ax
ret
;}
newLine endp
;-----------------------
;-----------------------
BIN_ASCII_32 proc near
;{
push edx esi eax
mov cx,L
;очистка
буфера вывода(заполнение
Clear_Buf_32:
;{
mov byte ptr [bx],' '
inc bx ; сдвигаем указатель буфера вправо
loop Clear_Buf_32
;}
dec bx
mov byte ptr [bx],'$'
inc cx
mov esi,10
NextNum_32:
;{
xor edx,edx
div esi ;делим частное на 10
add edx,'0' ;остаток от деления преобразуем в символ
dec bx ;двигаем указатель на буфер влево (ближе к началу)
mov byte ptr [bx],dl ;заносим полученный символ в буфер
inc cx ;увеличиваем счетчик кол-ва символов
or eax,eax ;частное = 0 ?
jnz NextNum_32 ;нет - продолжаем делить
;}
Exit_32:
;{
pop eax esi edx ; восстанавливаем исходные значения из стэка
ret
;}
;}
BIN_ASCII_32 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
;-----------------------
;}
PCInfo ends
;-------------
end start ;конец программы с точкой входа start
______________________________
DOS Version: 5.0
OEM: 255
Serial Number: 1193046
IBM PC with code: FC