помогите найти ошибку

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

  1. giskar

    giskar New Member

    Публикаций:
    0
    Регистрация:
    2 авг 2007
    Сообщения:
    43
    Помогите, пожалуста, найти ошибку в коде. Хочу вывести число на экран прочедурой num, для 16-ти бит всё нормально, а вот для 32-х не получается. Процедура num переводит число(0FFFFh) в строку. Дальше копируем числа в массив mas и пытаемся вывести этот массив на экран. Прога компилируется, но при работе возникает ошибка. Подскажите что не так?
    Код (Text):
    1. .586
    2.  
    3. .model flat,stdcall
    4.  
    5. include \masm32\include\user32.inc
    6. include \masm32\include\kernel32.inc
    7. includelib \masm32\lib\user32.lib
    8.  
    9. .data
    10. hi db "hi"
    11. mas dw 7 dup(" ")
    12.  
    13.  
    14. .code
    15. num proc
    16.  
    17.               std
    18.  
    19.                                                    ; AX - число   ES:DI-куда писать ответ
    20.                                                    ; Запись справа налево для STOSB
    21.          
    22.                 push ax
    23.  
    24.                 mov al,'$'
    25.                 stosb
    26.  
    27.                 pop ax              
    28.  
    29.                 mov     bx,10                      ; Делитель
    30. diving:
    31.                 xor     dx,dx                         ; Чтобы избежать переполнения при делении
    32.                 div     bx                               ; AX=частное DX=остаток
    33.                                                              ; DX=DL % 10
    34.                 push    ax
    35.                 mov     ax,dx
    36.  
    37.                 add     al,'0'
    38.                 stosb                                    ; AX -> [ES:DI] ; DEC DI
    39.  
    40.                 pop     ax
    41.  
    42.              
    43.                 or ax,ax                      ; Частное было равно нулю?
    44.                 jnz     diving                         ; Нет-продолжить цикл
    45.  
    46.  
    47.  
    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,0FFFFh
    64.  
    65. call num
    66.                      ;теперь es:[di] = 65535$
    67.  
    68. mov ebx,0
    69.                    
    70. .while ebx!='$'
    71. mov mas[ebx*2],di
    72. inc ebx
    73. dec di
    74. .endw
    75.  
    76. invoke MessageBox,0,addr mas,addr hi,0
    77.  
    78. invoke ExitProcess,0
    79. end main
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Ну так код перевода числа в строку использует 16битные регистры, а не 32 битные. +непонятно, где настраивается di перед использованием (должен быть edi, вообще-то) и почему здесь: 'mov mas[ebx*2],di' нужно умножать на два и почему в mas компируется содержимое di? И зачем его копировать, когда di (edi?) и так указывает на сконверитрованное число?

    В общем, чем такого лечить, проще родить нового -- 32битного :). Алгоритм останется тот же, но поменяются регистры. +надо проявить заботу о выделении буферов -- как-никак, среда-то защищенная.