Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Блокировка запуска программ 
:(
    Опции темы
EASports
Дата 12.5.2007, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 14.12.2006

Репутация: нет
Всего: нет



Вот блин думал-думал, хотел уж даже сделать переход в другую процедуру, там всё обработать... Блин, вот я не допёр-то. Конечно, просто флаг поставить. Пасиба огромное.  smile 
PM MAIL   Вверх
EASports
Дата 12.5.2007, 01:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 14.12.2006

Репутация: нет
Всего: нет



Чё-т у меня ну никак не получается вызвать прерывание из прерывания. Уж даже пытался повесить вывод строки на таймер, ну ни в какую. Вот код таймера, что не так, программа постоянно вместо нужной строки выводит какую-то ерунду и вылетает. 
Код

systimer proc

;cmp cs:flag,1
;jne ok
mov cs:flag,0
mov ah,9h
lea dx,cs:zapros
pushf
jmp cs:old21h   ; здесь и int 21h писал и call cs:old21h всё равно не работает.
ok:

jmp cs:old1ch
iret
endp

PM MAIL   Вверх
dumb
Дата 12.5.2007, 03:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 4
Всего: 158



Цитата(EASports @  12.5.2007,  01:21 Найти цитируемый пост)
Чё-т у меня ну никак не получается вызвать прерывание из прерывания.

есть такое страшное слово - нереентерабельность. кратко суть: int21 использует при работе некий кусок данных - хранит там, грубо, свое состояние. теперь ситуация: программа вызывает функцию, например, чтения строки/символа - т.е. выполнение "циклится" внутри 21h. приходит прерывание таймера, в котором ты пытаешься вывести строку посредством вызова 21h - получается вложенный вызов: находясь в обработчике 21h(чтение строки), опять вызывается обработчик 21h(вывод). те самые данные "накрываются" - системе каюк.
борьба с нереентерабельностью заключается в вывешивании флагов и опросах спец.флагов доса...

к нашим баранам: зачем тебе вообще таймер в твоей задаче?
пробила меня ностальгия, так что вот тебе "пирожок"(разгрызешь, надеюсь, сам): smile
Код

; tasm sample.asm
; tlink /t sample.obj

    .model tiny
    .386
    .code

MaxPswLen equ     8
BlFunc    equ     4b00h

    org 100h

start:
    jmp   init

log_name  db      '4blog.txt',0

sPswPmt   db      'pass: $'

BlProg    db      'mem.exe'
BlProgLen = ($ - BlProg)

BlPass    db      '123'
BlPassLen = ($ - BlPass)

psw_buf   db      MaxPswLen + 1
psw_len   db      0
psw_data  db      (MaxPswLen + 1) dup (0)

int_21h   proc

    cmp   ax, BlFunc
    jne   jmp_old

    pushf
    pusha
    push  ds es

;-- dbg log +
    pusha
    push  ds
    mov   si, ds
    mov   di, dx
    push  cs
    pop   ds
    mov   ax, 3d02h
    mov   dx, offset log_name
    xor   cx, cx
    int   21h
    mov   bx, ax
    jnc   skip_creat
    mov   ah, 3ch
    mov   dx, offset log_name
    xor   cx, cx
    int   21h
    mov   bx, ax
skip_creat:
    mov   ax, 4202h
    xor   cx, cx
    xor   dx, dx
    int   21h
    mov   ds, si
    mov   es, si
    mov   dx, di
    mov   cx, -1
    xor   ax, ax
    repne scasb
    not   cx
    mov   ah, 40h
    int   21h
    mov   ah, 3eh
    int   21h
ret_log:
    pop   ds
    popa
;-- dbg log -

    cld
    mov   cx, -1
    push  ds
    pop   es
    mov   di, dx
    xor   ax, ax
    repne scasb
    not   cx
    dec   cx
    mov   dx, cx
    dec   di
    mov   al, '\'
fname:
    cmp   al, es:[di-1]
    je    cmp_name
    dec   di
    loop  fname
cmp_name:
    sub   dx, cx
    mov   cx, dx
    cmp   cx, BlProgLen
    jne   rest_jmp_old
    push  cs
    pop   ds
    mov   si, offset BlProg
next_nc:
    mov   al, es:[di]
    or    al, 20h
    cmp   al, ds:[si]
    jne   rest_jmp_old
    inc   di
    inc   si
    loop  next_nc
        
    push  cs
    pop   ds
    mov   ah, 9
    mov   dx, offset sPswPmt
    int   21h
    mov   ah, 0ah
    mov   dx, offset psw_buf
    int   21h
    xor   cx, cx
    mov   cl, psw_len
    cmp   cl, BlPassLen
    jne   rest_iret
    mov   si, offset BlPass
    push  cs
    pop   es
    mov   di, offset psw_data
    repe  cmpsb
    je    rest_jmp_old

rest_iret:
    pop   es ds
    popa
    popf
    stc
    mov   ax, 5
    iret

rest_jmp_old:
    pop   es ds
    popa
    popf

jmp_old:
    db    0eah
old_21h   dd      0

int_21h   endp

init:

    mov   ax, ds:[2ch]
    mov   es, ax
    mov   ah, 49h
    int   21h
    mov   word ptr ds:[2ch], 0

    mov   ax, 3521h
    int   21h
    mov   word ptr old_21h, bx 
    mov   word ptr old_21h[2], es
    mov   ax, 2521h
    lea   dx, int_21h
    int   21h

    lea   dx, init
    int   27h

end start


ps. мысли о какой-либо оптимизации меня не посещали, поэтому тут уж сами... smile

PM MAIL   Вверх
EASports
Дата 26.5.2007, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 14.12.2006

Репутация: нет
Всего: нет



Рулез. Спасибо. Сначала не обратил внимания на эту прогу, не разобрался что называется. Но сегодня из-за безвыходности зашёл, скачал, откомпилил, разобрался и на её основе написал курсач. smile Клёво. Два часа и всё, а сидел дурак сутки, пытался сделать намного более хитрож...ым способом, ничего не получалось. Ещё раз огромное спасибо.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0702 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.