таблица векторов прерываний

Тема в разделе "WASM.BEGINNERS", создана пользователем giskar, 17 авг 2007.

  1. giskar

    giskar New Member

    Публикаций:
    0
    Регистрация:
    2 авг 2007
    Сообщения:
    43
    Почему то при использовании таблицы векторов прерываний код ассемблируется, но при запуске появляется окно с ошибкой. вот код, сассемблируйте и посмотрите что не так пожалста:
    Код (Text):
    1. cseg segment use16
    2. org 100h
    3.  
    4. begin:
    5. jmp init
    6.  
    7. ob proc
    8. cmp ah,9
    9. je ok
    10.  
    11. jmp dword ptr cs:[vect]
    12.  
    13. ok:
    14. push ds
    15. push dx
    16. push cs
    17. pop ds
    18.  
    19. mov dx,offset my
    20.  
    21. pushf
    22.  
    23. call dword ptr cs:[vect]
    24.  
    25. pop dx
    26. pop ds
    27.  
    28. iret
    29.  
    30. vect dd ?
    31. my db 'yahooo!$'
    32.  
    33. ob endp
    34.  
    35. init:
    36. ;mov ah,35h
    37. ;mov al,21h
    38. ;int 21h
    39.  
    40. xor ax,ax
    41. mov es,ax
    42.  
    43. mov bx,es:[21h*4]
    44. mov es,es:[21*4+2]
    45.  
    46. mov word ptr vect,bx
    47. mov word ptr vect+2,es
    48.  
    49. mov ax,2521h
    50. mov dx,offset ob
    51. int 21h
    52.  
    53. mov dx,offset init
    54.  
    55. int 27h
    56.  
    57. cseg ends
    58. end begin
     
  2. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    может надо
    Код (Text):
    1. call far dword ptr cs:[vect]
    Код (Text):
    1. jmp far dword ptr cs:[vect]
    кроме того, кто после call будет делать popf
     
  3. JAPH

    JAPH New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2007
    Сообщения:
    124
    опечатка? mov es, es:[21h*4+2]?

    rei3er
    эта "процедура" завершается iret, так что всё нормально
     
  4. giskar

    giskar New Member

    Публикаций:
    0
    Регистрация:
    2 авг 2007
    Сообщения:
    43
    всё работает
     
  5. giskar

    giskar New Member

    Публикаций:
    0
    Регистрация:
    2 авг 2007
    Сообщения:
    43
    Ещё один вопрос: что означает ошибка:"unresolved external symbol _ShellExecuteA@24". Ассемблирую такой код(Зубков):
    Код (Text):
    1. .486
    2. .model     flat,stdcall
    3. option casemap:none
    4.  
    5. include \masm32\include\shell32.inc
    6. include \masm32\include\kernel32.inc
    7.  
    8. .data
    9. URL db 'http://www.lionking.org/~cubbi/',0
    10.  
    11. .code
    12. main:        
    13. invoke ShellExecute,0,0, addr URL,0,0,0
    14.        
    15. invoke ExitProcess,0
    16.  
    17. end main
    подобная ошибка у меня возникает очень часто. Что не так?
     
  6. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Это значит, что внешний символ (функция), который используется в программе не найден в процессе линкования. Чтобы все заработало нужно подключить библиотеку, содержащую вызываемую функцию.
     
  7. lamer2k

    lamer2k New Member

    Публикаций:
    0
    Регистрация:
    14 май 2006
    Сообщения:
    88
    после инклудов

    includelib \masm32\include\kernel32.lib
    и т д
     
  8. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    JAPH
    а при входе в обработчик разве FLAGS не записывается в стек? :derisive:
     
  9. JAPH

    JAPH New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2007
    Сообщения:
    124
    rei3er
    Вы какой вызов имеете в виду?

    При входе в нашу obproc в стэке сохранены флаги и дальний адрес возврата.
    Если вызывается jmp dword ptr cs:[vect], то стэк не меняется, и iret оригинального обработчика корректно его очистит.
    Если же управление доходит до pushf/call dword ptr cs:[vect], то в стэке сохраняются вторые флаги и дальний адрес возврата на команду после call, которые будут очищены iret оригинального обработчика, а первые флаги с адресом очистятся нашим iret.

    Чi я вопрос не понял?
     
  10. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    JAPH
    все, я тупил
    вопрос снимается
     
  11. giskar

    giskar New Member

    Публикаций:
    0
    Регистрация:
    2 авг 2007
    Сообщения:
    43
    Товарищи у меня опять проблема, не могу чё то вывести массив на экран, выводится што то не то. Вот код:
    Код (Text):
    1. .model small
    2.  
    3. .386
    4.  
    5. .stack 100h
    6.  
    7. .data
    8. mes db "po umolchaniu dick C:$"
    9. mes1 db "po umolchniu stoit drugoi disk (ne c:)$"
    10. ha dw 0FFFFh
    11. mas dw 4 dup(?)
    12.  
    13. .data?
    14. wax dd ?
    15. way dd ?
    16. len dw ?
    17.  
    18. .code
    19. sc proc
    20.      mov ah,9
    21.      int 21h
    22.  
    23. ret
    24. sc endp
    25.  
    26. main:
    27. mov ax,@data
    28. mov ds,ax
    29.  
    30.  
    31. mov ah,19h
    32. int 21h
    33. jc exit
    34.  
    35. cmp al,02                                                     ; 02 - "C:\"
    36. jne pul
    37. mov dx,offset mes
    38. call sc
    39.  
    40. mov ah,36h
    41. mov dl,al
    42. int 21h
    43.  
    44. cmp ax,ha ; если ax=0FFFFh , то выходим
    45. jc exit
    46.  
    47.                ;если нет, то в
    48.                ; ax - число секторов в одном кластере
    49.                ; bx - количество свободных кластеров
    50.                ; cx - размер сектора в байтах
    51.                ; dx - общее число кластеров на диске
    52.  
    53. mov esi,0
    54. mov mas[0],ax
    55. mov mas[2],bx
    56. mov mas[4],cx
    57. mov mas[8],dx
    58.  
    59. mov esi,0
    60. mov cx,4
    61.  
    62. tig:                                ;выводим на экран массив mas
    63.      mov ah,2
    64.      mov dx,mas[esi*2]
    65.      add dl,30h
    66.      int 21h
    67.      inc esi
    68.      loop tig
    69.  
    70.  
    71.  
    72.    
    73. mul bx                                  ; теперь в bx находится "ax*bx"
    74.  
    75. mov word ptr wax,ax
    76. mov word ptr wax+2,dx
    77.  
    78.  
    79. mov eax,wax
    80. mov word ptr way,cx
    81.  
    82.  
    83. mul way
    84.  
    85.  
    86. jmp exit
    87.  
    88. pul:
    89.      mov dx,offset mes1
    90.      call sc
    91.    
    92. exit:
    93.      mov ah,10h
    94.      int 16h
    95.  
    96.      mov ax,4c00h
    97.      int 21h
    98.      
    99. end main
     
  12. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    А я думаю, массив выводится, но тебе видимо нужно, чтобы его элементы вывелись в виде десятичных чисел. Тогда нужно их преобразовать. Посмотри здесь http://www.wasm.ru/forum/viewtopic.php?id=20206
     
  13. mathio

    mathio New Member

    Публикаций:
    0
    Регистрация:
    16 июн 2007
    Сообщения:
    110
    giskar
    На мой пьяный взгляд код неправильный.
    По порядку.
    После отработки
    Код (Text):
    1. call sc
    al содержит код последнего выведенного символа, т.е. 24h.
    Вот этой командой
    Код (Text):
    1. mov dl,al
    как я понимаю, автор задумывал поместить в dl значение 02h, а помещается 24h.
    Т.е. последующий вызов int 21h определяет кол-во свободного места на неопределенном диске(24h), разумеется, если на машине автора их не такое же количество.
    Далее, вот эта команда
    Код (Text):
    1. cmp ax,ha
    при значении переменной ha=0FFFFh, будет выставлять флаг CF всегда(!), кроме случая, когда ax также равен 0FFFFh. Т.е. коментарий автора
    абсолютно не верен, переход
    Код (Text):
    1. jc exit
    срабатывает всегда, когда ax != 0FFFFh.

    Ик!
     
  14. giskar

    giskar New Member

    Публикаций:
    0
    Регистрация:
    2 авг 2007
    Сообщения:
    43
    Спокойно!, щас всё исправим
     
  15. giskar

    giskar New Member

    Публикаций:
    0
    Регистрация:
    2 авг 2007
    Сообщения:
    43
    mathio :

    Ещё раз:
    cmp ax,0FFFFh ; ax=0FFFFh ???
    jc exit ; Если равно, то CF=1. Переходим на метку exit

    ........

    Или я чего то не понимаю?????? Ты хочешь сказать, что ну нужно поставить jne ??
     
  16. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    Может быть je exit ?
     
  17. giskar

    giskar New Member

    Публикаций:
    0
    Регистрация:
    2 авг 2007
    Сообщения:
    43
    Vov4ick
    меня ведь тут интересует именно CF, а не равенство или не равенство ax и FFFFh.

    Вот код с вашей процедурой, я так понимаю, что в ax у меня теперь число секторов в кластере, по программа выдаёт вместо числа какие то строки:
    Код (Text):
    1. .model small
    2.  
    3. .stack 256
    4.  
    5. .data
    6. f dd 0
    7.  
    8. .code
    9.  
    10. num proc    
    11.                                                              ; AX - число   ES:DI-куда писать ответ
    12.                 std                                       ; Запись справа налево для STOSB
    13.                 mov     bx,10                      ; Делитель
    14. diving:
    15.                 xor     dx,dx                         ; Чтобы избежать переполнения при делении
    16.                 div     bx                               ; AX=частное DX=остаток
    17.                                                              ; DX=DL % 10
    18.                 push    ax
    19.                 mov     ax,dx
    20.  
    21.                 add     al,'0'
    22.                 stosb                                    ; AX -> [ES:DI] ; DEC DI
    23.  
    24.                 pop     ax
    25.                 or      ax,ax                          ; Частное было равно нулю?
    26.                 jnz     diving                         ; Нет-продолжить цикл
    27.                 ret
    28. num endp
    29.  
    30.  
    31. main:
    32. mov ax,@data
    33. mov ds,ax
    34.  
    35. mov ah,19h
    36. int 21h
    37.  
    38. mov dl,al
    39. mov ah,36h
    40. int 21h
    41.                                 ;теперь в ax число секторов в одном кластере
    42. call num                  
    43.  
    44. mov dx,es:[di]
    45. mov ah,9
    46. int 21h
    47.  
    48. mov dx,10h
    49. int 16h
    50.  
    51. mov ax,4c00h
    52. int 21h
    53.  
    54. end main
     
  18. mathio

    mathio New Member

    Публикаций:
    0
    Регистрация:
    16 июн 2007
    Сообщения:
    110
    JC -- Jump if Carry, переход осуществляется если установлен флаг CF, т.е. CF==1
    JE -- Jump if Equal, переход осуществляется если установлен флаг ZF, т.е. ZF==1

    Флаг CF после выполнения следующей инструкции:
    Код (Text):
    1. cmp ax, ha ; при word ptr [ha] == 0FFFFh
    2. jc exit
    будет устанавливаться ВСЕГДА, кроме случая, когда AX равен 0FFFFh, т.к. НЕТ ТАКОГО WORD КОТОРЫЙ ПО МОДУЛЮ БОЛЬШЕ 0FFFFh. Т.е. иными словами переход на метку EXIT будет осуществляться всегда, кроме случая, когда AX равен 0FFFFh(в этом случае будет установлен флаг ZF, а CF будет сброшен).
    giskar андерстенд?
     
  19. giskar

    giskar New Member

    Публикаций:
    0
    Регистрация:
    2 авг 2007
    Сообщения:
    43
    :)) mathio , спасибо, теперь понятно. И самое главное: я понял, что лучше из кода эту проверку на ошибку вобще убрать)))
     
  20. giskar

    giskar New Member

    Публикаций:
    0
    Регистрация:
    2 авг 2007
    Сообщения:
    43
    Хочу вывести на экран число 137. В коде преобразую его в строку, потом пытаюсь вывести эту строку на экран, выводится абра-кадабра. Объясните пожалуста что не так.
    Код (Text):
    1. .model small
    2.  
    3. .stack 100h
    4.  
    5. .data
    6. mesa db "ax ne raven nulu$"
    7. mesa1 db "ax raven nulu$"
    8.  
    9. .code
    10. num proc    
    11.                                                              ; AX - число   ES:DI-куда писать ответ
    12.                 std                                       ; Запись справа налево для STOSB
    13.                 mov     bx,10                      ; Делитель
    14. diving:
    15.                 xor     dx,dx                         ; Чтобы избежать переполнения при делении
    16.                 div     bx                               ; AX=частное DX=остаток
    17.                                                              ; DX=DL % 10
    18.                 push    ax
    19.                 mov     ax,dx
    20.  
    21.                 add     al,'0'
    22.                 stosb                                    ; AX -> [ES:DI] ; DEC DI
    23.  
    24.                 pop     ax
    25.                 or      ax,ax                          ; Частное было равно нулю?
    26.                 jnz     diving                         ; Нет-продолжить цикл
    27.                              
    28.                 ret
    29. num endp
    30.  
    31.  
    32. main:
    33. mov ax,@data
    34. mov ds,ax
    35.  
    36. mov ax,137
    37.  
    38. call num
    39.  
    40. mov ah,9
    41.  mov dx,es:[di]  
    42. int 21h
    43.  
    44. mov ax,4c00h
    45. int 21h
    46.  
    47. end main