![]() |
1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!
![]() |
Гость |
![]()
Сообщение
#1
|
Гость ![]() |
Всем привет. Помогите кто может. Своего серого не хватает!
Буду очень очень благодарна ![]() Задание: написать на языке Ассемблер резидентную программу в соответствии с вариантом задания. Общие требования: программа должна включать в себя резидентный обработчик прерывания (в соответствии с вариантом задания), и блок инициализации. Программа должна быть подготовлена для построения в COM-формате. В программе должны быть предусмотрены средства контроля за повторной установкой. Всю необходимую программе информацию (см. задание) она должна получать из командной строки. Вывод любой информации на экран должен осуществляться в текстовом режиме с сохранением образа той части экрана, в которую осуществляется вывод. После завершения работы содержимое экрана должно быть восстановленно. Все действия по выводу информации должны быть реализованы посредством вызова соответствующих функций BIOS. По желанию в программе могут быть предусмотрены средства выгрузки из памяти по запросу пользователя. Вид запроса на выгрузку программы - командная строка, "горячая клавиша" или другое - выбирается по усмотрению автора программы. Вариант Перехватывается прерывание 09H (клавиатура), горячая клавиша: <Ctrl>+<Alt>+<I>. Действия резидентной части программы: инвертировать порядок символов в слове, на котором в момент активизации находится курсор. Словом может считаться последовательность букв и цифр на экране, ограниченная с двух сторон любыми другими символами (а также началом или концом строки). |
![]() ![]() |
Malice |
![]()
Сообщение
#2
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 705 Пол: Мужской Репутация: ![]() ![]() ![]() |
Задача не архисложная, но объемная, делать все врядли кто будет. Показывай, что у тебя получается и на чем ты остановился.
|
Гость |
![]()
Сообщение
#3
|
Гость ![]() |
; Эта программа будет проверять, находиться ли она уже в памяти, и показывать
; глупое сообщение, если это так. В противном случае она будет инсталлировать ; в память и показывать другое сообщение. ; Если файл запустить с параметром /u то он его выгружает. ; Я специально оптимизацией не занимался, но мне будетинтересно если вы ее ; оптимизируете ; компилить: tasm tsr.asm ; tlink /t tsr.obj .model tiny .code org 100h start: jmp fuck newint9: cmp ax,0ACDCh ; Пользователь вызывает нашу функцию? je is_check ; Если да, отвечаем на вызов cmp ax,0AAAAh ; Пользователь выгружает наш резидент? je disabled ; Если да, выгружаем jmp dword ptr cs:[oldint9] ; Или переходим на исходный int9 is_check: mov ax,0DEADh ; Мы отвечаем на звонок iret ; И принуждаем прерывание возвратиться disabled: push ds ;сохраняем изменяемые регистры push dx push ax lds dx, dword ptr cs:[oldint9] ;загружаем адрес старого загрузчика ; в ds:dx mov ax,2509h ; Функция для возврата адреса ; старого обработчика int9 int 21h pop ax ;Востанавливаем регистры pop dx pop ds iret ; И принуждаем прерывание возвратиться oldint9 label dword int9_off dw 0000h ;указатель на старый обработчик int9_seg dw 0000h fuck: mov di,81h ;В области DTA смещаем смещение в di mov al," " ;через все пробелы mov cx,128 repe scasb dec di mov si,di cmp word ptr [si],'u/' ;сравниваем c /u jne install mov ax,0aaaah ;выгружаем int 9h mov ax,0900h ; Показываем сообщение 3 mov dx,offset msg_disabled int 21h jmp final install: mov ax,0ACDCh ; Проверка на резидентность int 9h ; cmp ax,0DEADh ; Мы здесь? je stupid_yes ; Если да, показываем сообщение 2 mov ax,3509h ; Если, инсталлируем программу int 21h ; Функция, чтобы получить векторы ; INT 9h mov word ptr cs:[int9_off],bx ; Мы сохраняем смещение в oldint9+0 mov word ptr cs:[int9_seg],es ; Мы сохраняем сегмент в oldint9+2 mov ax,2509h ; Функция для помещения нового ; обработчика int9 mov dx,offset newint9 ; где он находится int 21h mov ax,0900h ; Показываем сообщение 1 mov dx,offset msg_installed int 21h mov dx,offset fuck+1 ; Делаем резидент от смещения 0 до int 27h ; смещения в dx используя int 27h ; Это также прервет программу stupid_yes: mov ax,0900h ; Показываем сообщение 2 mov dx,offset msg_already int 21h final: int 20h ; Прерываем программу. msg_installed db "Глупый резидент не установлен. Устанавливаю...$" msg_already db "Глупый резидент жив и дает вам под зад!$" msg_disabled db "Убиваю глупый резидент. Убит наповал ( $" end start |
![]() ![]() |
![]() |
Текстовая версия | 20.06.2025 7:04 |