Помогите пожалуйста.... Tasm ругается на правильно работающую программу.... Выдаёт ошибку Fatal:32-bit record encountered in modul... Помогите исправить пожалуйста Код (Text): ; Поиск палиндрома методом суммы числа с его реверсом .386 .model flat, STDCALL extrn AllocConsole:PROC extrn ExitProcess:PROC extrn GetStdHandle:PROC extrn WriteConsoleA:PROC extrn ReadConsoleA:PROC extrn lstrlen:PROC ; макросы ;------------------------------------------------------------------------------------------------------------------------------------------ ;------------------------------------------------------------------------------------------------------------------------------------------ ;------------------------------------------------------------------------------------------------------------------------------------------ ;------------------------------------------------------------------------------------------------------------------------------------------ strtoint macro string,number,len local conv ; макрос перевода строки string в число BCD, len - количество символов xor eax,eax ; очистим аккумулятор mov ecx,0 mov edi,len conv: dec edi mov al,string[ecx] ; символ из strin с номером ecx в al sub al,30h ; вычитаем из кода символа 30h получаем цифру (30h-30h=0, 31h-30h=1, 32h-30h=2 и т.д.) inc ecx mov number[edi],al ; делаем обратный порядок чисел если в strin 12 то в number будет 21 cmp ecx,len ; если достигаем последнего символа , то конец jne conv endm ;------------------------------------------------------------------------------------------------------------------------------------------ ;------------------------------------------------------------------------------------------------------------------------------------------ inttostr macro number,string,len local conv1 ; макрос перевода числа BCD в строку string, len - количество символов xor eax,eax ; очистим аккумулятор mov ecx,0 mov edi,len mov string[edi],0 ; последний символ в строке - 0 conv1: dec edi mov al,number[ecx] ; символ из числа number с номером ecx в al add al,30h ; прибавляем к цифре 30h и получаем код этой цифры (0+30h=0, 1+30h=31h, 2+30h=32h и т.д.) inc ecx mov string[edi],al ; делаем обратный порядок чисел если в strin 12 то в max будет 21 cmp ecx,len ; если достигаем последнего символа , то конец jne conv1 endm ;------------------------------------------------------------------------------------------------------------------------------------------ ;------------------------------------------------------------------------------------------------------------------------------------------ addBCD macro s1,n1,s2,n2,sum,nsum local n1abov,n2abov,m1,m2,m3,m4,m5,neq,cf1,go0 ; макрос сложения двух BCD чисел ; параметры : s1 - первое слагаемое BCD число. n1- количество символов в первом BCD числе. ; s2- второе слагаемое BCD число. n2 - количество символов во втором BCD числе. ; sum - BCD число c результатом сложения. nsum - количество символов в BCD числе с результатом сложения. ; возвращает число в sum и колчество знаков в nsum mov eax,n1 cmp eax,n2 ; сравниваем n1 и n2 jae n1abov mov ecx,n1 ; n2>n1 перед сложением устанавливаем счетчик цикла на наименьшее количество разрядов в числе mov edx,n2 sub edx,n1 ; вычисляем разницу между n1 и n2 xor ebx,ebx ; очистим ebx xor eax,eax ; очистим аккумулятор m1: mov al,s1[ebx] ; берем разряд первого числа adc al,s2[ebx] ; складыаем с этим же разрядом второго числа с учетом переноса aaa ; корректируем для представления в BCD mov sum[ebx],al ; кидаем этот разряд в sum inc ebx loop m1 mov ecx,edx m2: mov al,0 ; остальные разряды наименьшего числа - 0 adc al,s2[ebx] ; складыаем с этим же разрядом второго числа с учетом переноса aaa ; корректируем для представления в BCD mov sum[ebx],al ; кидаем этот разряд в sum inc ebx loop m2 jmp n2abov n1abov: je neq ; если n1=n2 уходим на neq mov ecx,n2 ; n1>n2 перед сложением устанавливаем счетчик цикла на наименьшее количество разрядов в числе mov edx,n1 sub edx,n2 ; вычисляем разницу между n1 и n2 xor ebx,ebx ; очистим ebx xor eax,eax ; очистим аккумулятор m3: mov al,s1[ebx] ; берем разряд первого числа adc al,s2[ebx] ; складыаем с этим же разрядом второго числа с учетом переноса aaa ; корректируем для представления в BCD mov sum[ebx],al ; кидаем этот разряд в sum inc ebx loop m3 mov ecx,edx m4: mov al,0 ; остальные разряды наименьшего числа - 0 adc al,s1[ebx] ; складыаем с этим же разрядом второго числа с учетом переноса aaa ; корректируем для представления в BCD mov sum[ebx],al ; кидаем этот разряд в sum inc ebx loop m4 jmp n2abov neq: mov ecx,n2 ; n1=n2 перед сложением устанавливаем счетчик цикла на количество разрядов в числе xor ebx,ebx ; очистим ebx xor eax,eax ; очистим аккумулятор m5: mov al,s1[ebx] ; берем разряд первого числа adc al,s2[ebx] ; складыаем с этим же разрядом второго числа с учетом переноса aaa ; корректируем для представления в BCD mov sum[ebx],al ; кидаем этот разряд в sum inc ebx loop m5 n2abov: jc cf1 ; был ли перенос в старший разряд ; если не было то число разрядов на 1 меньше чем с переносом mov nsum,ebx jmp go0 cf1: ; если был перенос то учитываем его mov sum[ebx],0 adc sum[ebx],0 inc ebx ; увеличиваем на 1 число разрядов mov nsum,ebx go0: endm ;------------------------------------------------------------------------------------------------------------------------------------------ ;------------------------------------------------------------------------------------------------------------------------------------------ ;------------------------------------------------------------------------------------------------------------------------------------------ reversBCD macro s1,n1 local u1 ; макрос производит реверс BCD числа s1 с количеством разрядов n1 (например 123 - 321, 1376 - 6731) mov ecx,n1 ; в счетчик n1 xor ebx,ebx ; ebx очистить xor eax,eax ; eax очистить u1: dec ecx ; ecx-1 mov al,s1[ebx] ; берем символ из начала xchg s1[ecx],al ; меняем местами с последним mov s1[ebx],al ; кидаем в начало последний символ inc ebx ; ebx+1 cmp ebx,ecx ; сравниваем ecx и ebx jnae u1 ; цикл работает пока ecx < ebx endm ;------------------------------------------------------------------------------------------------------------------------------------------ ;------------------------------------------------------------------------------------------------------------------------------------------ compareBCD macro s1,n1,s2,n2 local p1,p2,p3 ; макрос сравнивает два числа BCD s1 и s2 , если равны , то в аккумуляторе 1, иначе 0 mov eax,n1 ; сравниваем разряды чисел cmp eax,n2 jne p2 ; если не равны разряды, то и числа не равны xor eax,eax ; чистим eax mov ecx,n1 ; в счетчик кладем количество разрядов n1 p1: dec ecx ; уменьшаем ecx mov al,s1[ecx] ; берем символ из первого числа cmp al,s2[ecx] ; сравниваем его с символом из второго числа jne p2 ; если не равны выходим из цикла cmp ecx,0 ; крутимся в цикле пока ecx не 0 jne p1 mov eax,1 ; цикл закончился значит числа равны, в аккумулятор 1 jmp p3 p2: xor eax,eax ; если не равны в аккумулятор 0 p3: endm ;------------------------------------------------------------------------------------------------------------------------------------------ ;------------------------------------------------------------------------------------------------------------------------------------------ equalBCD macro s1,n1,s2,n2 local a1 ; макрос приравнивает два числа BCD s1 и s2 (оператор s1=s2, n1=n2), xor ecx,ecx ; чистим ecx xor eax,eax ; чистим eax a1: mov al,s2[ecx] ; берем символ из s2 mov s1[ecx],al ; кидаем его в s1 inc ecx ; ecx+1 cmp ecx,n2 ; сравниваем ecx и n2 jne a1 ; пока не равны крутимся в цикле mov eax,n2 mov n1,eax ; приравниваем n1 и n2 endm ;------------------------------------------------------------------------------------------------------------------------------------------ ;************************************************************************************************************************************* ;************************************************************************************************************************************* .data ; описание переменных hout dd 0 ; дескриптор консоли для вывода hin dd 0 ; дескриптор консоли для ввода strout1 db 'Џ®ЁбЄ Ї®«Ё¤а®¬ , ¬Ґв®¤®¬ б㬬л зЁб« б ҐЈ® ॢҐаᮬ',10,10,13,'‚ўҐ¤ЁвҐ зЁб«®?',10,13,0 strout2 db 'Ќ ¦¬ЁвҐ Enter ¤«п ўл室 ',10,13,0 strout3 db '‚ўҐ¤Ґ®Ґ зЁб«® Ї «Ё¤а®¬',10,10,13,0 space db ' ',0 enterstr db 10,13,0 star db ' * ',0 equalstr db ' = ',0 x db 10000 dup (0) ; число в BCD strx db 10001 dup ('0') ; строка числа x nx dd 1 ; количество символов в x r db 10000 dup (0) ; реверс числа x в BCD strr db 10001 dup ('0') ; строка числа r nr dd 1 ; количество символов в r .code ; сама программа start: call AllocConsole ;выделяем консольное окно call GetStdHandle, 0FFFFFFF5h ; получаем дескриптор выходного буфера для консольного окна mov [hout], eax call GetStdHandle, 0FFFFFFF6h ; получаем дескриптор входного буфера для консольного окна mov [hin], eax beg: call lstrlen, offset strout1 call WriteConsoleA, [hout], offset strout1, eax, 0, 0 ; вывод сообщения call lstrlen, offset strx call ReadConsoleA, [hin], offset strx, eax, offset nx, 0 ; ввод числа sub nx,2 ; не учитываем символы 10 и 13 strtoint strx,x,nx ; переводим строку x в BCD число x equalBCD r,nr,x,nx ; r=x reversBCD r,nr ; реверс числа r compareBCD r,nr,x,nx ; сравниваем r и x cmp eax,1 jne mcicle ; если не равны т.е. число не палиндром уходим на основной цикл call lstrlen, offset strout3 ; если равны выводим сообщение и на начало программы call WriteConsoleA, [hout], offset strout3, eax, 0, 0 ; вывод сообщения jmp beg mcicle: addBCD x,nx,r,nr,x,nx ; x=x+r equalBCD r,nr,x,nx ; r=x reversBCD r,nr ; реверс числа r compareBCD r,nr,x,nx ; сравниваем r и x cmp eax,1 jne mcicle ; если не равны т.е. число не палиндром крутимся в цикле inttostr x,strx,nx ; переводим число x в строку strx call lstrlen, offset strx call WriteConsoleA, [hout], offset strx, eax, offset nx, 0 ; вывод сообщения call lstrlen, offset enterstr call WriteConsoleA, [hout], offset enterstr, eax, 0, 0 ; вывод сообщения call lstrlen, offset strout2 call WriteConsoleA, [hout], offset strout2, eax, 0, 0 ; вывод сообщения call lstrlen, offset strx call ReadConsoleA, [hin], offset strx, eax, 0, 0 ; ожидание нажатия enter call ExitProcess, 0 ; выход из прогрраммы end start
andrey6lp Было бы неплохо если бы ты указал строку на которую ругается компилятор, а пока не хватает строки Код (Text): includelib import32.lib чтобы линковщик знал откуда взять API-функции: AllocConsole, ExitProcess, GetStdHandle, WriteConsoleA, ReadConsoleA и lstrlen и поставь нормальную кодировку, хотя бы в комментариях, что же это за strout1, strout2 и strout3?
strout1 db 'Поиск полиндрома, методом суммы числа с его реверсом',10,10,13,'Введите число?',10,13,0 strout2 db 'Нажмите Enter для выхода',10,13,0 strout3 db 'Введенное число палиндром',10,10,13,0 Поставил Код (Text): includelib import32.lib всё равно не пашет(((