адреса, адреса...

Тема в разделе "WASM.BEGINNERS", создана пользователем cha0s, 10 окт 2006.

  1. cha0s

    cha0s New Member

    Публикаций:
    0
    Регистрация:
    10 окт 2006
    Сообщения:
    7
    Проблема конечно не совсем актуальная но всё же. Мне не понятно, как получить правельный адрес строки в обработчике прерывания ДОС. Вот мой код:

    Код (Text):
    1. assume cs:codes
    2.  
    3. codes segment para
    4.     org(100h)
    5.  
    6. main proc near
    7.              
    8.     jmp init
    9.              
    10. old_09h: dd 0
    11. fname: db 'some.txt$'           ; текст, который мне нужен в обработчике
    12.  
    13. x09h:                                ; собственно обработчик
    14. push ax
    15. push bx
    16. push cx
    17. push dx
    18. in al, 60h                           ; проверяем, нажата ли F12
    19. cmp al, 58h
    20. jne dontdo                         ; если нет, то ничего не делаем
    21.  
    22. mov ah, 9                           ; а вот здесь зарыта собака...
    23. lea dx, byte ptr fname           ; как бы я не пробовал обратиться к пасяти, нужную строку
    24. int 021h                             ; найти не могу...
    25.                                         ; пробовал и word ptr cs:[fname+/-100h]
    26.                                         ; и всякие другие изощрения (извращения), но результат один:
    27.                                         ; получаю на экране неопознанный кусок памяти
    28.  
    29. dontdo:
    30. pop dx
    31. pop cx
    32. pop bx
    33. pop ax
    34. jmp dword ptr cs:[old_09h]
    35.  
    36. ex09h:                             ; конец обработчика
    37.  
    38. init:                                 ; инициализация
    39. mov ah, 9                             ; для проверки вывожу в начале нужную строку
    40. mov dx, offset fname + 100h
    41. int 021h
    42.  
    43. xor dx, dx                         ; дальше идёт замена стандартного 09 прерывания, на моё...
    44. mov ds, dx
    45.  
    46. mov ax, ds:[09h*4]                                                                        
    47. mov word ptr cs:[old_09h], ax
    48. mov ax, ds:[09h*4+2]
    49. mov word ptr cs:[old_09h+2], ax
    50.  
    51. cli
    52. lea ax, x09h
    53. mov word ptr ds:[9h*4], ax
    54. push cs
    55. pop ax
    56. mov word ptr ds:[9h*4+2],ax
    57. sti
    58.  
    59. lea dx, ex09h                                          ; и выход с оставлением TSR
    60. int 027h
    61.              
    62. main endp
    63.              
    64. codes ends
    65. end main
    наверняка многие знают, что я делаю не так... помогите пожалуйста (всё на tasm'е)
     
  2. NoResponse

    NoResponse New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2005
    Сообщения:
    89
    Код (Text):
    1. push ds
    2. push cs                             ; ...вот здесь зарыта собака...
    3. pop ds                              ;--""--
    4. mov ah, 9                           ;оно всегда выводило то что находится в DS:DX
    5. lea dx, byte ptr fname
    6. int 021h
    7. pop ds
     
  3. cha0s

    cha0s New Member

    Публикаций:
    0
    Регистрация:
    10 окт 2006
    Сообщения:
    7
    это я тоже пробовал уже, результат:

    Недопустимая операция
    cs:fe2e IP:1145 op:63 61 6e 20 4d

    есть у кого-нибудь ещё варианты? :)
     
  4. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Код (Text):
    1. xor ax, ax
    2. push ds
    3. mov ds, ax
    4. les di, dword ptr ds:[9h*4] ; es:di == old interrupt, save it!
    5. cli
    6. mov word ptr ds:[9h*4+0], cs
    7. mov word ptr ds:[9h*4+2], offset new_int9h
    8. sti
    9. pop ds
    возможно накосячил с установкой обработчика (тогда надо поменять местами cs и offset).
     
  5. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    cha0s
    Тут вроде уже не раз писали об осторожности при вызове int 21h из обработчиков других прерываний.
     
  6. cha0s

    cha0s New Member

    Публикаций:
    0
    Регистрация:
    10 окт 2006
    Сообщения:
    7
    Люди, извините, первый совет был правельный. Я бы ещё вчера всё правильно сделал и не задавал бы этот вопрос, если бы запускал прогу под досом, а не из под command.com в WinXP. =) можно сказать - тема закрыта...