Форум: "Потрепаться";
Текущий архив: 2002.06.10;
Скачать: [xml.tar.bz2];
ВнизВопрос для тех, кто знает ассемблер Найти похожие ветки
← →
Udjin (2002-05-06 16:36) [0]Делаю контрольную работу на ассемблере (чайник я в этом деле). Нужно определить номер версии DOS, программа по условию резидентная. Вот что получилось
CSEG segment
assume cs:CSEG, ds:CSEG
org 100h
start: jmp Myload ;Переход на выпонение загрузочной части
key dw 5555h ;Ключ для определения загружен ли резидент
oldvect dd ? ;здесь запоминается адрес правильного
;обработчика прерывания 09h
highDos db ? ;здесь хранится старшая цифра версии Dos
lowDos db ? ;здесь младшая старшая цифра версии Dos
mes db "MsDos $" ;собщение при выводе номера версии
point db ".$" ;разделение старшей и младшей цифры версии
new proc ;начало резидентной части
push ax ;сохраняем в стеке регистры
push es
push bx
push cx
push dx
in ax,60h ;Чтение порта клавиатуры в AX
cmp al,46 ;Проверка нажатия клавиши "С"
jnz exit ;если нет, то возврат управления
mov ax,0 ;Чтение флагов состояния
mov es,ax ;клавиатуры в регистр AL и
mov al,es:[0417h] ;определение нажаты ли клавиши
and al,00001100b ;Ctrl-Alt,если нет, то
cmp al,00001100b ;возврат управления
jnz exit
in al,61h ;Освобождене
or al,80h ;буфера
out 61h,al ;клавиатуры от
and al,7Fh ;скан кода
out 61h,al
mov cx,6 ;вывод слова MsDos
mov bx,offset mes
m1: mov ah,0eh
mov al,cs:[bx]
int 10h
inc bx
loop m1
mov bx,offset highDos ;вывод старшей цифры версии Dos
mov ah,0eh
mov al,cs:[bx]
int 10h
mov bx,offset point ;вывод разделяющей точки
mov ah,0eh
mov al,cs:[bx]
int 10h
mov bx,offset lowDos ;вывод младшей цифры версии Dos
mov ah,0eh
mov al,cs:[bx]
int 10h
exit:
pop dx ;восстановление регистров
pop cx
pop bx
pop es
pop ax
jmp cs:oldvect;передача управления оригинальному обработчику
new endp
Myload:
;начало загрузочной части
cmp word ptr es:[103h],5555h
je inst
mov ah,30h ;получение версии Dos
int 21h
mov highDos,al
mov lowDos,ah
add highDos,30h ;смещение до соответствующих цифр
add lowDos,30h
mov ah,35h ;Чтение вектора 09h
mov al,09h
int 21h
mov word ptr oldvect,bx ;сохранение вектора прерывания
mov word ptr oldvect+2,es
mov ah,25h ;установка вектора 09h на адрес
mov al,09h
mov dx,offset new ;резидентной процедуры old
int 21h
mov dx,offset Myload ;Адрес конца резидентной части
int 27h ;KEEP
inst:
mov ah,9;Если в памяти, то выведем соответствующее сообщение
mov dx,offset mes2 ;
int 21h
mov ah,4ch ;возврат управления
int 21h ;
mes2 db "already loaded $";сообщение если резидент в памяти
CSEG ends
end start
Возникли следующие вопросы
1. Запретить повторный запуск резидента не удаётся, хотя как это делается в книжке подсмотрел
2. Как вывести номер версии если он окажется, например, 6.22
Моя программа в этом случае не сработает
3. Как на Ассемблере определить скорость процессора (это к другой контрольной)
P.S. Всё это само-собой под Dos
← →
copyr25 (2002-05-06 16:53) [1]Могу выслать .rar . SysInfo107. Где скачал - уже не помню:)) Версию ОС точно, определяет.
И много всего тоже определяет. Работает и под DOS и в окошке под Windows.
C исходниками. Пишите письма:))
← →
Udjin (2002-05-06 16:58) [2]Адрес мой fint78@yandex.ru
← →
copyr25 (2002-05-06 17:21) [3]Ещё в прошлом веке мне однажды пришлось сделать
программку для управления магнитофоном от "мышиного"
порта через дешифратор, вообщем, там всего комбинации
на двух дырочках доступны 00 01 10 11 :))
.8086
page ,132
;нажатие F12 подает +5В на 7-ю ножку RS-232
;нажатие F11 отключает этот потенциал
;обрабатывается попытка повторной загрузки
;запуск с ненулевым хвостом выгружает резидент из памяти
CSEG segment
assume cs:cseg,ds:cseg,es:cseg
org 100h
f10 proc
jmp init
old09h dd 0 ; буфер для сохранения старого вектора 9h
old2fh dd 0 ; буфер для сохранения старого вектора 2fh
flag db 0 ; буфер флага "выгружать из памяти"
new2fh proc ; ПОП 2fh - связь с резидентными программами
cmp ah,0c8h ; наша функция прерывания?
jne out2fh ; нет
cmp al,0 ; да, попытка повторной загрузки?
je inss ; да, обработаем запрет
cmp al,1 ; требование на выгрузку?
je unins ; да
jmp short out2fh ; ни то, ни другое - не обрабатываем
inss: mov al,0ffh ; покажем, что программа уже загружена
iret ;
out2fh: jmp cs:old2fh ; переход в след.обработчик 2fh
; выгрузим программу из памяти, предварительно восстановив все
; перехваченные ею векторы (9h и 2fh)
unins: push ds es dx ; сохраним исп.регистры
mov ax,2509h ; установить вектор 09h
lds dx,cs:old09h ; адрес старого вектора
int 21h ; восстановили 09h
mov ax,252fh ; установить вектор 2fh
lds dx,cs:old2fh ; адрес старого вектора
int 21h ; восстановили 2fh
mov es,cs:2ch ; получим из PSP адрес собственного
mov ah,49h ; окружения резидента и выгрузим его
int 21h ;
push cs ; выгрузим теперь саму программу
pop es ;
mov ah,49h ;
int 21h ;
pop dx es ds ;
iret ;
new2fh endp
new09h proc ; ПОП 09fh - прерывание от клавиатуры
push ax ;
in al,60h ;
cmp al,58h ; скен-код F12 ?
je yes ; да
cmp al,57h ; F11?
je yes
pop ax ;
jmp cs:old09h ; отдаемся старому вектору
yes:
push bx
mov bl,al ; сохраняем скен-код в bl
push dx
mov al,0 ; задаем параметры передачи COM1
or al,10011011B
mov ah,0
mov dx,0
int 14h
mov dx,3f8h+4 ; адрес регистра данных COM1
mov al,bl ;
sub al,56h ; 1 в al гасит 7-ю ножку, 2 - зажигает
out dx,al ; передаем
pop dx
mov al,bl
pop bx
in al,61h ; восстановим разрешение прерываний
or al,80h ; от клавиатуры
out 61h,al
and al,7fh
out 61h,al
mov al,20h
out 20h,al
pop ax
iret
new09h endp
endres=$ ;
f10 endp ;
init proc ;
mov cl,es:80h ; смотрим, был ли хвост при запуске
cmp cl,0 ; был?
je conti ; нет
inc flag ; установим флаг для выгрузки
conti: mov ah,0c8h ; вызов связи с резидентом с функц. c8h
mov al,0 ; смотрим, программа установлена?
int 2fh ;
cmp al,0ffh ;
je inst ; да, наша сигнатура
mov ax,352fh ; вектор 2fh
int 21h ;
mov word ptr cs:old2fh,bx ; сохраним
mov word ptr cs:old2fh+2,es ; в буфере
mov ax,252fh ;
mov dx,offset new2fh ; и укажем для него новую ПОП
int 21h ;
mov ax,3509h ; вектор 9h
int 21h ;
mov word ptr cs:old09h,bx ; сохраним
mov word ptr cs:old09h+2,es ; в буфере
mov ax,2509h ;
mov dx,offset new09h ; и укажем для него новую ПОП
int 21h ;
mov ah,9h ; сообщим, что F10 установлен
mov dx,offset mes ;
int 21h ;
mov ax,3100h ; завершим программу
mov dx,(endres-f10+10fh)/16 ; оставив ее резидентной
int 21h ;
inst: ;
cmp flag,1 ; выгружать?
je uin ; да
mov ah,9h ; сообщим, что
mov dx,offset mes1 ; программа УЖЕ загружена
int 21h ;
mov ax,4c01h ; и выйдем с errorlevel=1
int 21h ;
uin: mov ax,0c801h ; посылаем из вновь запущенной
int 2fh ; F10 резиденту в памяти
mov ah,09h ; признак для выгрузки (1)
mov dx,offset mes2 ; сообщаем, что программа
int 21h ; выгружается
mov ax,4c00h ; и выходим из вновь запущенной
int 21h ;
init endp
mes db "Драйвер управления магнитофоном загружен",10,13
db "Клавиша F12 включает магнитофон",10,13
db "Клавиша F11 - выключает",10,13
db "Для выгрузки драйвера - набрать magnit off",10,13,10,13
db "(C) copyr25@yahoo.com$"
mes1 db "Драйвер управления магнитофоном УЖЕ загружен$"
mes2 db "Драйвер управления магнитофоном выгружен из памяти$"
CSEG ends
end f10
Может, чем и поможет?
:))
← →
copyr25 (2002-05-06 17:52) [4]fint78@yandex.ru: Послал Вам .rar. Но там крутой asm:))) Имейте ввиду.
← →
copyr25 (2002-05-06 18:53) [5]mov dx,offset Myload ;Адрес конца резидентной части
int 27h ;KEEP
Вот от этого и не работает.
В 1995 г. была такая книжка "Программируем на языке ассемблера IBM PC"
часть 2. Прикладное программирование. Издательство ЭНТРОП, Москва, 1995.
П.И.Рудаков, К.Г.Финогенов.
стр.115 "Резидентный обработчик прерывания от клавиатуры с подключением
после системного обработчика".
Я до сих пор эту книжку люблю. И 1-ю часть, и 3-ю. За работающие коды.
А Финогенов, ваще, ещё тот Мастер -- он и в asm"e, и в web"e, и в Pascal"e многих
российских программеров обучил. Найдите книжку! Не пожалеете:))
← →
Udjin (2002-05-07 08:43) [6]to copyr25
благодарю за письмо. Попробую разобраться с крутым asm-ом :)). С ограничением запуска разобрался. Сначала переменной key присвоил зачение отличное от 5555h, а строки
cmp word ptr es:[103h],5555h
je inst
заменил на
mov ax,0
mov es,ax
cmp word ptr es:[102h],5555h
je inst
mov es:[102h],5555h
to All С последними 2-мя вопросами я пока не смог разобраться.
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2002.06.10;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.006 c