Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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
14-31004
Подонок
2002-05-07 15:46
2002.06.10
Кто знает злачные места в Питере?Где женского пола много.


3-30698
maxim2
2002-05-18 11:07
2002.06.10
Как в Database Deskstop создавать индексы


1-30821
undo
2002-05-29 18:03
2002.06.10
возможно ли запустить процесс асинхронно с помощью Create procces


1-30848
Виталик
2002-05-29 11:21
2002.06.10
StatusBar


1-30814
gserg
2002-05-31 14:05
2002.06.10
События в D.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский