Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 21 • Страница 1 из 21  2  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
Вообщем задача такова, сделать прогу резидентной и стандартный обработчик прерывания таймера заменить своим, делаю я так:
Код:
.386
   .model tiny
   .code
         OldTimer dd ?
new1ch:
pusha      
push   es   
push   ds

push   cs   
pop   ds   


;код обработчика

pop   ds      
pop   es
popa
jmp   cs:OldTimer
            

init:

        mov ax,351ch
   int 21h

        mov word ptr  OldTimer, bx
        mov word ptr  OldTimer+2, es

        mov dx,offset new1ch
        mov ax,251ch
   int 21h
   
   mov ax,251ch
   mov dx,word ptr OldTimer+2
   mov ds,dx
   mov dx,word ptr cs:OldTimer
   int 21h

   mov     dx,offset init
        int     27h
   end  init

В итоге под виндой все это дело выкидывает после запуска коммандную строку и я ничего не могу сделать. Под ДОСом ошибка EMM386. Так вот что я неправильно сделал?

_________________
Ку ку



Партнер
 

Advanced member
Статус: Не в сети
Регистрация: 10.04.2003
Откуда: Москва
Daemon писал(а):
А может у кого-то есть какие-то предположения??? А то я незнаю че делать!


вспомнилась фраза из Маски-Шоу о заброске шпиона "Вы ошиблись дверью, дружище!"

Посмотри здесь: (конференция assembler на http://www.sources.ru )
http://forum.sources.ru/index.php?s=a13 ... owforum=38
И обязательно почитай FAQ на этой странице - там все это описано.
Вообще, конкретно твой вопрос там настолько часто и подробно расматривался....


--------------------

По теме:
пошто про флаги забыл? pushf/popf
стек не резиновый. Причем, ты пользуешься _чужим_ стеком. Не хорошо.
Если делается много действий - сделай свой стек для себя.
Код COM конечно? .... тогда надо отдать лишнюю память OS.
При запуске COM файла OS дает ему всю память поле его конца.
Если память не отдать - DOS память просто кончится.
Код:
; move stack to   end
      mov   sp,offset end_prog
; resize size prog
      mov   ax,cs
      mov   es,ax
      mov   ds,ax
      mov   bx,(end_prog-start+10fh+64)/16
      mov   ah,4ah
      int   21h


Последний раз редактировалось serj 03.06.2004 15:42, всего редактировалось 1 раз.

 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
Ага большое спасибо за все, надо постучаться в нужную дверь. Да а про флаги забыл.

_________________
Ку ку


 

Daemon
У тебя не программа, а полный бред...

.386
.model tiny
.code

jmp init



OldTimer dd ?
new1ch:
pusha
pushf
push es
push ds

push cs
pop ds


;код обработчика

pop ds
pop es
popf
popa
jmp cs:OldTimer


init:

mov ax,351ch
int 21h

mov word ptr OldTimer, bx
mov word ptr OldTimer+2, es

mov ax,cs
mov ds,ax
mov ax,251ch
lea dx, new1ch
int 21h


mov dx,offset init+0100h ; для EXE и + 00 для COM
int 27h

mov ax,4c00h
int 21h


end init


 

Advanced member
Статус: Не в сети
Регистрация: 30.08.2003
Откуда: Санкт-Петербург
Цитата:
mov ax,251ch
mov dx,word ptr OldTimer+2
mov ds,dx
mov dx,word ptr cs:OldTimer
int 21h

А зачем это делать? Насколько я понимаю, это попытка (похоже неудачная) вернуть старый обработчик на место.

Вот работающий код:
Цитата:
org 256
main proc
jmp init
sym1 dw 421Eh
sym2 dw 24E1h
count db 0
new_1ch proc ; кривой обработчик. Что-то выводит на экран :)
push AX
push ES
inc CS:count
test byte ptr CS:count, 03h
jnz exit
mov AX, 0B800h
mov ES,AX
mov AX, CS:sym1
xchg AX, CS:sym2
mov CS:sym1, AX
mov ES:3998,AX
exit: pop ES
pop AX
iret
new_1ch endp
main endp
init proc
mov AX, 251Ch ; Заполним вектор
mov DX, offset new_1ch ; смещение нашего обработчика
int 21h
mov AX, 3100h ; Завершить прогу и оставить в памяти
mov DX, (init-main+10Fh)/16 ; размер резидентной части
int 21h
init endp
text ends
end main

_________________
{:€ дед в законе :-) нородный окодемег
почетный пользователь OpenSuSE 11.3
Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
Саботажник это не программа, это всег маленькая часть. Но что есть, то есть. Но вот что этого не надо делать, я уже понял:
Код:
   
   mov ax,251ch
   mov dx,word ptr OldTimer+2
   mov ds,dx
   mov dx,word ptr cs:OldTimer
   int 21h


Добавлено спустя 56 секунд:
Root ты меня опередил.

Добавлено спустя 6 минут, 4 секунды:
Код:
mov ax,cs
mov ds,ax
mov ax,251ch
lea dx, new1ch
int 21h

Я подобным образом у Финогенова видел, точно через ds?

Цитата:
А зачем это делать? Насколько я понимаю, это попытка (похоже неудачная) вернуть старый обработчик на место.

По моему таким образом старый обработчик возвращаеться на место у Зубкова.

_________________
Ку ку


 

Member
Статус: Не в сети
Регистрация: 28.08.2003
Откуда: Moscow
решить ребус НИТКА+НИТКА=ТКАНЬ

_________________
From EVO6... www.hot-hatch.ru


 

Junior
Статус: Не в сети
Регистрация: 31.05.2004
Откуда: Ереван
EVO6
Цитата:
НИТКА+НИТКА=ТКАНЬ


15306+15306=30612
Собственноручно написанная програмка на C++ за секунду дала ответ!!!
Вот и код:
Код:
#include <iostream.h>
#include <stdlib.h>

bool IsNumValid(int x);
bool IsSolution(int x);

void main()
{
   cout<<"nitka + nitka = tkanj"<<endl;
   for(int i=10000; i<50000; i++)
   {
      if(IsNumValid(i))
      {
         if(IsSolution(i))
            cout<<i<<" + "<<i<<" = "<<2*i<<endl;
      }
   }
}

bool IsNumValid(int x)
{
   char str[6];
   itoa(x, str, 10);
   for(int i=0; i<4; i++)
   {
      for(int j=i+1; j<5; j++)
      {
         if(str[i]==str[j])
            return false;
      }
   }
   return true;
}

bool IsSolution(int x)
{
   if(!IsNumValid(2*x))
      return false;
   char str1[6];
   char str2[6];
   itoa(x, str1, 10);
   itoa(2*x, str2, 10);
   if(str1[0]!=str2[3]||str1[2]!=str2[0]||str1[3]!=str2[1]||str1[4]!=str2[2])
      return false;
   return true;
}

_________________
Когда другие уже закончили, процессоры Intel Pentium продолжают работать, работать и работать ...


Последний раз редактировалось Spook 04.06.2004 14:01, всего редактировалось 1 раз.

 

Member
Статус: Не в сети
Регистрация: 01.12.2003
Откуда: msk.ru
Цитата:
Собственноручно написанная програмка на C++ за секунду дала ответ!!!

Это не асм :down:


 

А на ассемблере то нибудь может?


 

Junior
Статус: Не в сети
Регистрация: 31.05.2004
Откуда: Ереван
Luxe писал(а):
А на ассемблере то нибудь может?

Хочеться кого нибудь помучить?????
:)

_________________
Когда другие уже закончили, процессоры Intel Pentium продолжают работать, работать и работать ...


 

Advanced member
Статус: Не в сети
Регистрация: 10.04.2003
Откуда: Москва
Luxe писал(а):
А на ассемблере то нибудь может?

Вариант: IDA

... :D


 

Пожалуйста помогите написать на Assemblere не ипользуя IDA


 

Advanced member
Статус: Не в сети
Регистрация: 30.08.2003
Откуда: Санкт-Петербург
Цитата:
Я подобным образом у Финогенова видел, точно через ds?

Именно так. Кстати, Финогенов - офигительно полезная книжка. Жалко в электронном варианте не видел :( Как и Зубкова :(

_________________
{:€ дед в законе :-) нородный окодемег
почетный пользователь OpenSuSE 11.3
Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad


 

Advanced member
Статус: Не в сети
Регистрация: 10.04.2003
Откуда: Москва
Root писал(а):
Цитата:
Я подобным образом у Финогенова видел, точно через ds?

Именно так. Кстати, Финогенов - офигительно полезная книжка. Жалко в электронном варианте не видел :( Как и Зубкова :(


Господа, зачем нужны 'толкования', если есть 'превоисточник'?
Ralf Brown's Interrupt List:
http://www-2.cs.cmu.edu/afs/cs/user/ral ... files.html
ftp://ftp.cs.cmu.edu/afs/cs.cmu.edu/use ... rupt-list/
RTFM, please!


 

serj_

Я например всегда пользуюсь TECHHELP! 6.0


 

Advanced member
Статус: Не в сети
Регистрация: 30.08.2003
Откуда: Санкт-Петербург
Цитата:
TECHHELP! 6.0

Полезная вещь. Только примеров кода там мало :(

_________________
{:€ дед в законе :-) нородный окодемег
почетный пользователь OpenSuSE 11.3
Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad


 

Member
Статус: Не в сети
Регистрация: 25.09.2003
Откуда: Донбасс
http://www.wasm.ru/forum/

_________________
Видишь дурака? - ОБОЙДИ!!!


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
Млин, тут еще одна трабла, не хочет работать резидентность, ДОС виснит, а Винда - выкидывает недопустимую инструкцию:
Код:
text   segment      'code'
   assume cs:text,ds:text
   org 256
main   proc
   jmp init
sym1   dw   421eh
sym2   dw   241eh
count   db   0

new_1ch   proc
   push   ax
   push   es
   inc   cs:count
   test   byte ptr cs:count,03h
   jnz    exit

   mov   ax,0b800h
   mov      es,ax
   mov   ax,cs:sym1

   xchg   ax,cs:sym2
   mov   cs:sym1,ax
   mov   es:3998,ax

exit:   pop   es
   pop   ax
   iret
new_1ch   endp
main   endp
init   proc

   mov   ah,25h
   mov   al,1ch
   mov    dx,offset new_1ch
   int    21h

   mov   ah,09h
   mov   dx,offset mes
   int   21h

        mov    ax,3100h
        mov     dx,(init-main+10fh)/16

   int   21h
init   endp
mes   db   'Already Resident$'
text   ends
   end   main

_________________
Ку ку


 

Advanced member
Статус: Не в сети
Регистрация: 10.04.2003
Откуда: Москва
Daemon писал(а):
Млин, тут еще одна трабла, не хочет работать резидентность, ДОС виснит, а Винда - выкидывает недопустимую инструкцию

Не хочешь читать FAQ? :)
Ok, прямой link: http://pascal.sources.ru/asm/faq/index.htm#tsr
(ошибки мелкие, но много - длина программы считается не правильно, флаги не сохраняются .... )


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 21 • Страница 1 из 21  2  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan