Вектора прерываний

Тема в разделе "WASM.BEGINNERS", создана пользователем Dimka, 4 дек 2007.

  1. Dimka

    Dimka New Member

    Публикаций:
    0
    Регистрация:
    4 дек 2007
    Сообщения:
    8
    Здраствуйте!
    У меня проблемка, с помощью ф-ии 35h сохранил сегмент и сдвиг вектора прерываний, теперь не могу их выести... Вывожу с помощью ф-ии 40h, пишет что то не то... может я в чем ошибся... Вот код программы ->

    Код (Text):
    1. MASM                    ;режим работы TASM: ideal или masm
    2. MODEL  huge            ;модель памяти
    3. .386
    4. .DATA                   ;сегмент данных
    5.     keep_cs      dw 0          ;хранит сегмент заменяемого прерывания
    6. ;   keep_ip      dw 0          ;хранит смещение прерывания
    7.  
    8. ;
    9. .CODE                   ;сегмент кода
    10.  
    11. MAIN PROC
    12. ;
    13. MOV AX,@DATA
    14. MOV DS,AX
    15. mov ah,35h                 ;функция получения вектора
    16. mov al,21h                  ;номер вектора
    17. int 21h                    ;теперь сегмент в ES, смещение в BX
    18. ;mov keep_ip,bx             ;запоминаем смещение
    19. mov keep_cs,bx             ;запоминаем сегмент
    20. ;
    21. MOV  AH,40H          ;номер функции
    22. MOV  BX,1            ;дескриптор дисплея
    23. LEA  DX,keep_cs       ;загржаем адрес строки
    24. MOV  CX,16        ;число выводимых байтов
    25. INT  21H             ;
    26.  
    27. ;MOV AH,09H
    28. ;MOV DX,BX
    29. ;INT 21H
    30. ;
    31. MOV AH,4CH        ;пересылка 4ch в регистр ah
    32. INT 21H             ;вызов прерывания с номером 21h
    33. MAIN ENDP            ;конец процедуры main
    34.  
    35. END MAIN ;конец программы с точкой входа main
     
  2. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Dimka
    Сдвиг -- это команда такая. А у адресов -- смещения, а не сдвиги.

    Код (Text):
    1. mov ah,35h ;функция получения вектора
    2. mov al,21h ;номер вектора
    3. int 21h ;теперь сегмент в ES, смещение в BX
    4. ;mov keep_ip,bx ;запоминаем смещение
    5. mov keep_cs,bx ;запоминаем сегмент
    Вообще-то, судя по коду, смещение запоминается на месте сегмента, а сегмент вовсе не запоминается.

    Код (Text):
    1. MOV AH,40H ;номер функции
    2. MOV BX,1 ;дескриптор дисплея
    3. LEA DX,keep_cs ;загржаем адрес строки
    4. MOV CX,16 ;число выводимых байтов
    5. INT 21H ;
    Если честно, не помню, что делает фунция 40h прерывания 21h, но почему-то у меня есть смутное ощущение, что она не предназначена для корректного отображения двоичных чисел...
     
  3. doctor_Ice

    doctor_Ice New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2005
    Сообщения:
    845
    Адрес:
    Russia
    INT 21 - DOS 2+ - WRITE TO FILE WITH HANDLE
    AH = 40h
    BX = file handle
    CX = number of bytes to write
    DS:lol: X -> buffer
    Return: CF set on error
    AX = error code
    CF clear if successful
    AX = number of bytes written
    Note: if CX is zero, no data is written, and the file is truncated or extended
    to the current position
     
  4. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    doctor_Ice

    Спасибо. Собсно, это и ожидал, но уверен не был (список интов у меня обрезанный -- только БИОС, поскольку для ДОСа всё равно не пишу).

    Dimka

    В общем, белиберду и должны получить: и сам вектор должным образом не сохраняете, и в читабельный вид его не преобразуете.
     
  5. Dimka

    Dimka New Member

    Публикаций:
    0
    Регистрация:
    4 дек 2007
    Сообщения:
    8
    Код (Text):
    1. mov ah,35h ;функция получения вектора
    2. mov al,21h ;номер вектора
    3. int 21h ;теперь сегмент в ES, смещение в BX
    4. ;mov keep_ip,bx ;запоминаем смещение
    5. mov keep_cs,es ;пробовал и с es; запоминаем сегмент
    тогда вопрос, как правильно его преобразовать и вывести на экран...
    П.С. просто только начал изучать ассемблер, поэтому могу писать кое что не совсем понимая(((
     
  6. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Dimka
    Надо сначала из внутреннего (двоичного) вида преобразовать, например, в шестнадцатеричный. И печатать уже шестнадцатеричные числа.

    Алгоритм перевода сами придумаете, или как? :)
     
  7. Dimka

    Dimka New Member

    Публикаций:
    0
    Регистрация:
    4 дек 2007
    Сообщения:
    8
    Ыыы(( Не могу нигде найти как, памагите плз...)))
     
  8. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Dimka

    Вот подпрограммка, которая вроде как должна преобразовывать число в AX в строку (адрес строки -- в ES:lol: I). Указывается заодно число цифр, которые нужно получить (вдруг надо младший байт AX, а не весь регистр)

    Код (Text):
    1. ; Convert value in AX to hexadecimal string
    2. ; On enter:
    3. ;   ax = value
    4. ;   cx = count of hex dights
    5. ;   es:di = address of string
    6. ; All registers and flags will be saved
    7.  
    8. CvtToHex    PROC NEAR
    9.  
    10.     pushf
    11.     pusha
    12.     mov    bx, offset CvtTable
    13.     std
    14.     add     di, cx
    15.     dec     di
    16.  
    17. @@: push    ax
    18.     and     al, 0Fh
    19.     xlat
    20.     stosb
    21.     pop     ax
    22.     shr     ax, 4
    23.     loop    @B
    24.  
    25.     popa
    26.     popf
    27.     retn
    28.  
    29. CvtToHex    ENDP
    30.  
    31. CvtTable    DB   '0123456789ABCDEF'
     
  9. Dimka

    Dimka New Member

    Публикаций:
    0
    Регистрация:
    4 дек 2007
    Сообщения:
    8
    Код (Text):
    1. @@: push    ax
    2.     and     al, 0Fh
    3.     xlat
    4.     stosb
    5.     pop     ax
    6.     shr     ax, 4
    7.     loop    @B
    вот тут вопрос, что значит @@: push ax
     
  10. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Dimka
    @@ это безымянная метка. чтобы на нее сослаться можно использовать @B или @F
    @B ссылается на ближайшую предыдущую безымянную метку (Backward)
    @F ссылается на следующую ближайшую безымянную метку (Forward)
    используется типа такого:

    ; some loop
    @@:
    ....
    loop @B

    или

    test eax, eax
    jz @F
    ...
    @@:
     
  11. Dimka

    Dimka New Member

    Публикаций:
    0
    Регистрация:
    4 дек 2007
    Сообщения:
    8
    Код (Text):
    1. ;
    2. MASM                          ;режим работы TASM: ideal или masm
    3. ;
    4. MODEL  SMALL           ;модель памяти
    5. ;
    6. .386
    7. ;
    8. .DATA                           ;сегмент данных
    9. CvtTable    DB   '0123456789ABCDEF'
    10. ;
    11.  
    12. .CODE                ;сегмент кода
    13. ;
    14. MAIN PROC
    15. MOV AX,@DATA
    16. MOV DS,AX
    17. ;
    18. MOV AH,35H                 ;функция получения вектора
    19. MOV AL,21H                 ;номер вектора 21H
    20. INT 21H                        ;теперь сегмент в ES, смещение в BX
    21.  
    22. mov ax,offset bx
    23. call CvtToHex
    24. ;
    25.  
    26. MOV  AH,40H          ;номер функции вывода строки
    27. MOV  DX,OFFSET di       ;загржаем адрес строки
    28. MOV  BX,1            ;дескриптор дисплея
    29. MOV  CX,4        ;число выводимых байтов
    30. INT  21H          
    31. ;
    32. MOV AH,4CH        ;пересылка 4ch в регистр ah
    33. INT 21H             ;вызов прерывания с номером 21h
    34. ;
    35. MAIN ENDP            ;конец процедуры main
    36. ;
    37. CvtToHex    PROC NEAR
    38.  
    39.     pushf
    40.     pusha
    41.     mov    bx, offset CvtTable
    42.     std
    43.     add     di, cx
    44.     dec     di
    45.  
    46. @@: push    ax
    47.     and     al, 0Fh
    48.     xlat
    49.     stosb
    50.     pop     ax
    51.     shr     ax, 4
    52.     loop    @B
    53.  
    54.     popa
    55.     popf
    56.     retn
    57.  
    58. CvtToHex    ENDP
    59. END MAIN ;конец программы с точкой входа main
    ааа, мазги взрываются!!! что не правильно подскажите плз.
    при создании .obj пишет следующее->
    C:\DOCUME~1\9335~1>C:\TASM\BIN\TASM.EXE a.asm
    Turbo Assembler Version 4.1 Copyright (c) 1988, 1996 Borland International

    Assembling file: a.asm
    **Error** a.asm(52) Undefined symbol: @B
    Error messages: 1
    Warning messages: None
    Passes: 1
    Remaining memory: 452k
    ======================
    но чувствую что еще где то косяк(((
     
  12. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Dimka

    @@, @B и @F -- это фичи MASM. Попробуйте заменить их на какое-нить другое имя (одинаковое и в метке, и в команде перехода на неё). Или просто вместо @B поставить @@. Похоже, МАСМ и ТАСМ не полностью совместимы :)
     
  13. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    ну не только. в фасме например тоже есть.
     
  14. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    тож прикольно :)
     
  15. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Great
    С фасмом не знаком :) Но в данном случае моя подпрограммка была на МАСМе написана, а человек ТАСМ юзает. Вот и выползла несовместимость. Давным-давно тоже ТАСМ юзал, но его ж не развивают :dntknw:
     
  16. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Freeman
    Угу, на сей ляпсус я внимания не обратил -- заметил только возмущение компилятора по поводу метки :)
     
  17. Dimka

    Dimka New Member

    Публикаций:
    0
    Регистрация:
    4 дек 2007
    Сообщения:
    8
    Все, стал более менее жогонять, и нашел процедуру для 10х, переделал под 16чные, вобщем вод код программы, авось каму пригодиться (правда немного не доделан, ща ищу как вводить 16чные символы с клавы=))
    Код (Text):
    1. MODEL  SMALL           ;модель памяти
    2.  
    3. .386
    4.  
    5. .DATA                           ;сегмент данных
    6. tbl    DB   '0123456789ABCDEF' ;таблица
    7. res             db 2 dup(' ')   ;результат
    8.       db '$'
    9. del db  16
    10. text    db  'Vv Prerivanie','$'
    11.  
    12. .CODE                ;сегмент кода
    13.  
    14. start:
    15. mov ax,@DATA
    16. mov ds,ax
    17.  
    18. mov ah,02h       ;ввод с клавиатуры
    19. int 21h
    20.  
    21. MOV AH,35H                 ;функция получения вектора
    22. MOV AL,21H                 ;номер вектора 21H
    23. INT 21H                        ;теперь сегмент в ES, смещение в BX
    24.  
    25. mov cx,bx        ;cx в bx
    26.  
    27. lea bx,tbl           ;в bx адресс начала таблицы
    28. lea si,res           ;адрес результата -> si
    29. mov dx,si        ;сохраняем адрес рез-та в регистре dx
    30. mov al,ch            ;число для преобразования
    31. cbw          ;преобразует байт в слово
    32. div del          ;делим число на основание системы
    33. xlat             ;преобразуем al в символ
    34. mov byte ptr [si],al         ;сохранить в первом эл-те строки
    35. xchg ah,al       ;обменять байты
    36. xlat
    37. mov byte ptr [si]+1,al  ;сохранить al во втором эл-те строки
    38.  
    39. mov ah,9h       ;вывод на экран
    40. int 21h
    41.  
    42. lea bx,tbl           ;в bx адресс начала таблицы
    43. lea si,res           ;адрес результата -> si
    44. mov dx,si        ;сохраняем адрес рез-та в регистре dx
    45. mov al,cl            ;число для преобразования
    46. cbw          ;преобразует байт в слово
    47. div del          ;делим число на основание системы
    48. xlat             ;преобразуем al в символ
    49. mov byte ptr [si],al         ;сохранить в первом эл-те строки
    50. xchg ah,al       ;обменять байты
    51. xlat
    52. mov byte ptr [si]+1,al  ;сохранить al во втором эл-те строки
    53.  
    54.  
    55. mov ah,9h       ;вывод на экран
    56. int 21h
    57.  
    58. mov ax,4c00h        ;ф-ия завершения программы
    59. int 21h
    60. end start
    61. end