Ассемблер (Серийный номер тома) для MS-DOS

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
fastmen
Сообщения: 1
Зарегистрирован: 17 авг 2010, 10:16

Люди помогите надо на ассемблере написать резидентную прогу для MS-DOS которая считывала бы серийный номер тома, Для примера лучше Флоп диск 3.5 дюйма.

Задание

Код: Выделить всё

1.Программа должна быть реализована как резидентная в среде DOS

2.Способ вывода функции программное прерывание по вектору 60h. Номер конкретной функции передается в регистр Ah

3.Таблица вызова функции должна быть рассчитана на диапазон номеров функций 0-255

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

5.реализовать функцию возвращает серийный номер тома.

6.Сообщение при ошибках при выполнении функции стандартная для функции DOS

Вот код,

Код: Выделить всё

assume CS:CSEG, DS:CSEG, SS:CSEG, ES:CSEG
CSEG segment
org 100h
Begin:
mov ah, 33h
mov si, offset File
int 60h
mov ah, 9
mov dx, offset File
int 21h
mov ax, 4C00h
int 21h
 
File db 11 dup (0), 24h
CSEG ends
end Begin

Код: Выделить всё

ASSUME CS:KNSEG, DS:KNSEG, SS:KNSEG, ES:KNSEG
KNSEG segment
org 100h
Start:
jmp INIT
Obrabotchik:
push ds
push cs
pop ds
mov FN, ah
mov al, ah
xor ah, ah
shl ax, 1
mov di, offset Addr_Table
add di, ax
call di
pop ds
iret
Func proc
xor ax, ax                               ;Обнуление регистра ax
mov ch, 0                                ;номер дорожки
mov cl, 1                                ;номер сектора
mov dh, 0                                ;номер головки
mov dl, 0                                ;номер устройства
push es                                  ;сохранение регистра ES в стеке
mov ax, cs                               ;Настройка регистра ES на сегмент кода
mov es, ax
mov bx, offset BootSect                  ;Буфер для чтения сектора
mov ah, 2                                ;Номер функции
mov al, 1                                ;число секторов для чтения
int 13h                                  ;Прерывание BIOS для чтения с диска
cmp ah, 0
jz Ok
jmp near ptr Goto_Ret
Ok:
mov OldSI, si                            ;Сохранение переданного указателя
mov si, offset BootSect                  ;Настройка регистра SI на начало буфера
pop es                                   ;Восстановление из стека в регистр ES
add si, 39                               ;Установка смещения
mov di, offset LabelOfDisk               ;Настройка регистра DI на переменную
mov cx, 4
NextSymb:                                ;Перевод
mov al, [si]                             ;метки диска
mov [di], al                             ;из буфера
inc di
inc si
loop NextSymb                            ;в переменную
mov cx, 4
mov si, OldSI                            ;восстановление переданного в прерывание параметра в регистр SI
mov di, offset LabelOfDisk               ;Настройка регистра DI на переменную
NextSymbol:                              ;Перенос
mov al, [di]                             ;метки диска
mov es:[si], al
inc di                                   ;в сегмент
inc si                                   ;программы, вызвавшей прерывание
loop NextSymbol
Goto_Ret:
ret
Func endp
Zaglushka proc
mov ah, 0EEh
ret
Zaglushka endp
OldSI dw 0                                ;Переданный указатель, в котором находится адрес, по которому нужно записать метку диска
LabelOfDisk db 11 dup (0)                 ;Метка диска
Addr_Table dw 256 dup (0)                 ;Таблица адресов
FN db 0
BootSect db 512 dup (0)                   ;Буфер для чтения загрузочного сектора
INIT:
mov di, offset Addr_Table
mov si, offset Zaglushka
mov cx, 256
Label2:
mov [di], si
add di, 2
loop Label2
mov di, offset Addr_Table
add di, 66h
mov si, offset Func
mov [di], si
mov ah, 25h
mov al, 60h
lea dx, Obrabotchik
int 21h
lea dx, INIT
int 27h

KNSEG ends
end Start
Не работает в MS-DOS , хотя на метку тома переделать с легкостью получается, а на серийный номер тока , нет.
Что я только не пробовал, DOS либо виснет или выводит сообщение

Код: Выделить всё

Memory allocation error
cannot load COMMAND, system halted
ПОМОГИТЕ ЛЮДИ!!!!!!!!!!
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Для асма есть отдельная тема. Зачем в WinApi, Shell тулить? Перенёс.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить