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

Discussion in 'WASM.BEGINNERS' started by giskar, Aug 17, 2007.

  1. Mika0x65

    Mika0x65 New Member

    Blog Posts:
    0
    Joined:
    Jul 30, 2005
    Messages:
    1,384
    Code (Text):
    1. mov ah,9
    2. mov dx,es:[di]
    Этого категорически недостаточно. Во-первых, в dx попадает содержимое ячейки, куда ссылается 'es:[di]', а не смещение к этой ячейке. Во-вторых, стринг должен быть $-terminated. В общем, код должен выглядеть так:


    Code (Text):
    1. ...
    2. num proc    
    3.                                             ; AX - число   ES:DI-куда писать ответ
    4.  std                                       ; Запись справа налево для STOSB
    5.  push ax                                 ; Число пока в стек
    6.  mov al, '$'                              ;
    7.  stosb                                    ; Сохраняем признак конца строки
    8.  pop ax                                   ; Число на место
    9.  mov bx, 10                             ; Делитель
    Это чтобы добавить '$' в конец.

    И вызов:
    Code (Text):
    1.  push ds
    2.  push es
    3.  pop ds
    4.  mov dx, di
    5.  mov ah, 9
    6.  int 21h
    7.  pop ds
     
  2. giskar

    giskar New Member

    Blog Posts:
    0
    Joined:
    Aug 2, 2007
    Messages:
    43
    Mika0x65 :
    Спасибо, великолепно. Работает. 32 строки понадобилось для того , что бы вывести число на экран:)) Сразу вспоминается Си со своим printf и %d)))))
     
  3. Vov4ick

    Vov4ick Владимир

    Blog Posts:
    0
    Joined:
    Oct 8, 2006
    Messages:
    581
    Location:
    МО
    И пара десятков килобайт кода для этого :derisive:
    Для того и создаются библиотеки процедур, чтобы каждый раз не изобретать велосипед.
     
  4. giskar

    giskar New Member

    Blog Posts:
    0
    Joined:
    Aug 2, 2007
    Messages:
    43
    опять проблема. Теперь хочу вывести на экран число побольше. Комп выдаёт "переполнение деления", неу то есть значение делимого более чем в 65536 раз больше значения делителя, но на самом деле это вроде бы не так. В чём ошибка?
    Code (Text):
    1. .model small
    2.  
    3. .stack 100h
    4.  
    5. .data
    6. wax dw ?
    7.  
    8. .code
    9. num proc    
    10.               std
    11.  
    12.                ; mov ax,word ptr wax
    13.                ; mov dx,word ptr wax+2
    14.                                                              ; WAX - число   ES:DI-куда писать ответ
    15.                                                              ; Запись справа налево для STOSB
    16.          
    17.                 push ax
    18.  
    19.                 mov al,'$'
    20.                 stosb
    21.  
    22.                 pop ax              
    23.  
    24.                 mov     bx,10                      ; Делитель
    25. diving:
    26.                 ; xor     dx,dx                         ; Чтобы избежать переполнения при делении
    27.                 div     bx                               ; AX=частное DX=остаток
    28.                                                              ; DX=DL % 10
    29.                 push    ax
    30.                 mov     ax,dx
    31.  
    32.                 add     al,'0'
    33.                 stosb                                    ; AX -> [ES:DI] ; DEC DI
    34.  
    35.                 pop     ax
    36.                 or      ax,ax                          ; Частное было равно нулю?
    37.                 jnz     diving                         ; Нет-продолжить цикл
    38.  
    39.  
    40.  
    41.                 push ds
    42.                 push es
    43.                 pop ds
    44.  
    45.                 mov dx,di
    46.                 mov ah,9
    47.                 int 21h
    48.  
    49.                 pop ds
    50.                              
    51.                 ret
    52. num endp
    53.  
    54.  
    55. main:
    56. mov ax,@data
    57. mov ds,ax
    58.  
    59. ; mov wax,77777
    60.  
    61. mov ax,45
    62. mov dx,23
    63.  
    64. call num
    65.  
    66. mov ax,4c00h
    67. int 21h
    68.  
    69. end main
     
  5. Mika0x65

    Mika0x65 New Member

    Blog Posts:
    0
    Joined:
    Jul 30, 2005
    Messages:
    1,384
    giskar
    div работает не с ax, а с ax:dx -- в dx находятся старшая часть слова. В твоем случае ты пытаешься разделить число 0x2D0017 (2949143) на 10. Это равно 0х48002 (294914), т.е. число, большее вместимости двух байт (0xFFFF) отсюда и ошибка.
     
  6. mathio

    mathio New Member

    Blog Posts:
    0
    Joined:
    Jun 16, 2007
    Messages:
    110
    0x17002d :derisive:
     
  7. Mika0x65

    Mika0x65 New Member

    Blog Posts:
    0
    Joined:
    Jul 30, 2005
    Messages:
    1,384
    mathio
    Да, пардон, перепутал. Но переполнение все равно происходит: 0x17002d / 0xA = 0x2 4CD1.
     
  8. giskar

    giskar New Member

    Blog Posts:
    0
    Joined:
    Aug 2, 2007
    Messages:
    43
    Mika0x65
    Не понимаю, откуда ты берёшь число 0х2D0017. У меня есть двойное слово dx:ax, соответственно число 23:45 (2345). В hex это будет 929. Его мы и делим на 10. Кажется так, или нет?
     
  9. giskar

    giskar New Member

    Blog Posts:
    0
    Joined:
    Aug 2, 2007
    Messages:
    43
    Посмотрите пожалуста ещё этот код, вроде выводит числа максимум до 0FFFFFh.
    Code (Text):
    1. .model small
    2.  
    3. .586
    4.  
    5. .stack 100h
    6.  
    7. .data
    8. wax dw ?
    9. divident dword 0FFFFFh
    10. quotent qword ?
    11. modulo word ?
    12.  
    13.  
    14. .code
    15. num proc  
    16.                 std
    17.              
    18.               push ax
    19.  
    20.                mov al,'$'
    21.                 stosb
    22.  
    23.                 pop ax              
    24.  
    25.                 mov     bx,10  
    26.  
    27.                mov ax,word ptr divident+2
    28.                 xor dx,dx
    29.                div bx
    30.                
    31.                mov ax,word ptr divident
    32.                div bx
    33.  
    34. io:              
    35.                push ax
    36.  
    37.                 mov ax,dx
    38.  
    39.                 add     al,'0'
    40.                 stosb  
    41.  
    42.                  pop     ax
    43.                 or      ax,ax                          ; Частное было равно нулю?
    44.                 jnz     diving  
    45.                  jmp up
    46.  
    47. diving:
    48.                 xor dx,dx                         ; Чтобы избежать переполнения при делении
    49.                 div bx                               ; AX=частное DX=остаток
    50.                   jmp io                
    51.  
    52.  
    53. up:
    54.                 push ds
    55.                 push es
    56.                 pop ds
    57.  
    58.                mov dx,di
    59.                 mov ah,9
    60.                 int 21h
    61.  
    62.                 pop ds
    63.                              
    64.                 ret
    65. num endp
    66.  
    67.  
    68. main:
    69. mov ax,@data
    70. mov ds,ax
    71.  
    72. call num
    73.  
    74. mov ax,4c00h
    75. int 21h
    76.  
    77. end main
     
  10. giskar

    giskar New Member

    Blog Posts:
    0
    Joined:
    Aug 2, 2007
    Messages:
    43
    И объясните пожалуста как нужно делить, если одна часть находится в одном регистре, а другая - в другом?
     
  11. Vov4ick

    Vov4ick Владимир

    Blog Posts:
    0
    Joined:
    Oct 8, 2006
    Messages:
    581
    Location:
    МО
    Не понял, как по-твоему лежит число в двух регистрах. Например, есть число 124696361 или 76EB729h. Если его положить в DX:AX, то DX=076eh AX=0b729h. Дальше можно его делить на 16-разрядный регистр. Например, BX=10, div bx даст... INT 0 - частное не влезает в 16 бит :derisive:
     
  12. giskar

    giskar New Member

    Blog Posts:
    0
    Joined:
    Aug 2, 2007
    Messages:
    43
    Vov4ick
    ну да, ну да, я так и говорю)) В dx и ax по 4 знака, т.е. dx=xxxxh и ax=ххххh.
     
  13. giskar

    giskar New Member

    Blog Posts:
    0
    Joined:
    Aug 2, 2007
    Messages:
    43
    Ведь когда мы делим на bx=10 , у нас делится только ax. А что же с dx?
     
  14. giskar

    giskar New Member

    Blog Posts:
    0
    Joined:
    Aug 2, 2007
    Messages:
    43
    Укажите пожалусна на ошибку, и посмотрите на коментарии - всё ли верно? Программа выдаёт на экран число 65538, почему так?:dntknw:(
    Code (Text):
    1. .model small
    2.  
    3. .586
    4.  
    5. .stack 100h
    6.  
    7. .data
    8.  
    9. divident dd 0FFFFFFFFh
    10. q dw ?
    11.  
    12. .code
    13. num proc  
    14.                 std
    15.              
    16.               push ax
    17.  
    18.                mov al,'$'                      ; в конец строки записываем "$"
    19.                 stosb
    20.  
    21.                 pop ax              
    22.  
    23.                 mov     bx,10              ; делитель
    24.  
    25.              
    26.                div bx                         ;делим  10002 на 10    
    27. io:              
    28.                push ax
    29.  
    30.                 mov ax,dx                  ; в ax кладём остаток
    31.  
    32.                 add     al,'0'      
    33.                 stosb                          ; в es:[di] теперь первая часть нашего десятичного числа
    34.                                                    ;  и di уменьшается на единицу (так?)
    35.  
    36.                  pop     ax
    37.                 or      ax,ax                          ; Частное было равно нулю?
    38.                 jnz     diving                         ; если нет - снова делим, теперь уже ax на 10 (нужно ли теперь обнулять dx?)
    39.                  jmp up                                ; если да - выводим наше десятичное число на экран
    40.  
    41. diving:
    42.                 xor dx,dx                         ; Чтобы избежать переполнения при делении
    43.                 div bx                               ; AX=частное DX=остаток
    44.                   jmp io                
    45.  
    46.  
    47. up:
    48.                 push ds
    49.                 push es
    50.                 pop ds
    51.  
    52.                mov dx,di
    53.                 mov ah,9
    54.                 int 21h
    55.  
    56.                 pop ds
    57.                              
    58.                 ret
    59. num endp
    60.  
    61.  
    62. main:
    63. mov ax,@data
    64. mov ds,ax
    65.  
    66. mov ax,2                      ;    в dx :ax  находится число  10002, так?
    67. mov dx,1                      ;    его мы и делим на 10.
    68. call num
    69.  
    70. mov ax,4c00h
    71. int 21h
    72.  
    73. end main
     
  15. mathio

    mathio New Member

    Blog Posts:
    0
    Joined:
    Jun 16, 2007
    Messages:
    110
    Вы меня удивляете своими высказываниями..

    И при этом же пишите достаточно сложные алгоритмы _правильно_.
    Как это возможно, откройте тайну? Или это обычный копипаст откуда-то?
     
  16. mathio

    mathio New Member

    Blog Posts:
    0
    Joined:
    Jun 16, 2007
    Messages:
    110
    Одна из главных ошибок в том, что вы никуда не сохраняете частное между div'ами.
     
  17. giskar

    giskar New Member

    Blog Posts:
    0
    Joined:
    Aug 2, 2007
    Messages:
    43
    Ура! Я её всё-таки написал.Спасибо Vov4ick-у, процедура, которую он тогда написал очень помогла)). mathio, ну вы поймите, если я не буду задавать такие глупые вопросы, то никогда не научусь ничему:)) Вот верный код:
    Code (Text):
    1. .model small
    2.  
    3. .586
    4.  
    5. .stack 100h
    6.  
    7. .data
    8. divident dd 0FFFFFFFFh
    9. quotent dd 0
    10. modulo dw ?
    11.  
    12.  
    13. .code
    14. num proc  
    15.                 std
    16.                push ax
    17.                mov al,'$'
    18.                stosb
    19.                pop ax    
    20.          
    21.  
    22.                mov     bx,10                                
    23.                                                                  
    24.                mov        ax,word ptr divident+2
    25.                xor        dx,dx
    26.                div        bx
    27.                mov        word ptr quotent+2,ax
    28.  
    29.                mov        ax,word ptr divident
    30.                 div        bx
    31.                mov        word ptr quotent,ax
    32.  
    33.                 mov        modulo,dx
    34.                                                               ; теперь остаток в modulo
    35.                                                               ; а частное в quotent
    36. io:
    37.             mov ax,word ptr quotent+2            
    38.              mov dx,word ptr quotent  
    39.                
    40.                 push ax  
    41.  
    42.                mov ax,modulo
    43.  
    44.                 add     al,'0'
    45.  
    46.                 stosb  
    47.  
    48.                 pop    ax
    49.  
    50.              mov word ptr quotent+2,ax            
    51.              mov word ptr quotent,dx
    52.  
    53.                 cmp quotent,0               ; Частное было равно нулю?
    54.  
    55.                  jnz     diving  
    56.                  jmp up
    57.  
    58. diving:
    59.  
    60.               mov     ax,word ptr quotent+2    
    61.                xor dx,dx                                      ; Чтобы избежать переполнения при делении
    62.                 div bx                                          
    63.               mov    word ptr quotent+2,ax  
    64.  
    65.                mov        ax,word ptr quotent
    66.                 div        bx
    67.                mov        word ptr quotent,ax
    68.  
    69.                 mov        modulo,dx
    70.                                                                 ; теперь остаток в modulo
    71.                                                                 ; а частное в quotent
    72.                 jmp io
    73.  
    74. up:
    75.                 push ds
    76.                 push es
    77.                 pop ds
    78.  
    79.                mov dx,di
    80.                 mov ah,9
    81.                 int 21h
    82.  
    83.                 pop ds
    84.                              
    85.                 ret
    86. num endp
    87.  
    88.  
    89. main:
    90. mov ax,@data
    91. mov ds,ax
    92.  
    93. call num
    94.  
    95. mov ax,4c00h
    96. int 21h
    97.  
    98. end main