Помогите, пожалуста, найти ошибку в коде. Хочу вывести число на экран прочедурой num, для 16-ти бит всё нормально, а вот для 32-х не получается. Процедура num переводит число(0FFFFh) в строку. Дальше копируем числа в массив mas и пытаемся вывести этот массив на экран. Прога компилируется, но при работе возникает ошибка. Подскажите что не так? Код (Text): .586 .model flat,stdcall include \masm32\include\user32.inc include \masm32\include\kernel32.inc includelib \masm32\lib\user32.lib .data hi db "hi" mas dw 7 dup(" ") .code num proc std ; AX - число ES:DI-куда писать ответ ; Запись справа налево для STOSB push ax mov al,'$' stosb pop ax mov bx,10 ; Делитель diving: xor dx,dx ; Чтобы избежать переполнения при делении div bx ; AX=частное DX=остаток ; DX=DL % 10 push ax mov ax,dx add al,'0' stosb ; AX -> [ES:DI] ; DEC DI pop ax or ax,ax ; Частное было равно нулю? jnz diving ; Нет-продолжить цикл ; push ds push es pop ds ; mov dx,di ; mov ah,9 ; int 21h ; pop ds ret num endp main: mov ax,0FFFFh call num ;теперь es:[di] = 65535$ mov ebx,0 .while ebx!='$' mov mas[ebx*2],di inc ebx dec di .endw invoke MessageBox,0,addr mas,addr hi,0 invoke ExitProcess,0 end main
Ну так код перевода числа в строку использует 16битные регистры, а не 32 битные. +непонятно, где настраивается di перед использованием (должен быть edi, вообще-то) и почему здесь: 'mov mas[ebx*2],di' нужно умножать на два и почему в mas компируется содержимое di? И зачем его копировать, когда di (edi?) и так указывает на сконверитрованное число? В общем, чем такого лечить, проще родить нового -- 32битного . Алгоритм останется тот же, но поменяются регистры. +надо проявить заботу о выделении буферов -- как-никак, среда-то защищенная.