ошибка Fatal:32-bit record encountered in modul

Тема в разделе "WASM.BEGINNERS", создана пользователем andrey6lp, 1 июн 2009.

  1. andrey6lp

    andrey6lp New Member

    Публикаций:
    0
    Регистрация:
    1 июн 2009
    Сообщения:
    2
    Помогите пожалуйста.... Tasm ругается на правильно работающую программу....
    Выдаёт ошибку Fatal:32-bit record encountered in modul...
    Помогите исправить пожалуйста
    Код (Text):
    1. ; Поиск палиндрома методом суммы числа с его реверсом
    2.  
    3. .386
    4. .model flat, STDCALL
    5.  
    6.  
    7. extrn    AllocConsole:PROC
    8. extrn    ExitProcess:PROC
    9. extrn    GetStdHandle:PROC
    10. extrn    WriteConsoleA:PROC
    11. extrn    ReadConsoleA:PROC
    12. extrn    lstrlen:PROC
    13.  
    14. ; макросы
    15. ;------------------------------------------------------------------------------------------------------------------------------------------
    16. ;------------------------------------------------------------------------------------------------------------------------------------------
    17.  
    18. ;------------------------------------------------------------------------------------------------------------------------------------------
    19. ;------------------------------------------------------------------------------------------------------------------------------------------
    20.    
    21. strtoint    macro   string,number,len
    22. local   conv
    23. ; макрос перевода строки string в число BCD, len - количество символов
    24.     xor     eax,eax ; очистим аккумулятор
    25.     mov     ecx,0
    26.     mov     edi,len
    27. conv:      
    28.     dec     edi
    29.     mov     al,string[ecx]  ; символ из strin с номером ecx в al
    30.     sub     al,30h      ; вычитаем из кода символа 30h получаем цифру (30h-30h=0, 31h-30h=1, 32h-30h=2 и т.д.)
    31.     inc     ecx
    32.     mov     number[edi],al ; делаем обратный порядок чисел если в strin 12 то в number будет 21
    33.     cmp     ecx,len ; если достигаем последнего символа , то конец
    34.     jne     conv
    35.     endm
    36. ;------------------------------------------------------------------------------------------------------------------------------------------    
    37. ;------------------------------------------------------------------------------------------------------------------------------------------
    38. inttostr    macro   number,string,len
    39. local conv1
    40. ; макрос перевода числа BCD в строку string, len - количество символов
    41.     xor     eax,eax ; очистим аккумулятор
    42.     mov     ecx,0
    43.     mov     edi,len
    44.     mov     string[edi],0 ; последний символ в строке - 0
    45. conv1:     
    46.     dec     edi
    47.     mov     al,number[ecx]  ; символ из числа number с номером ecx в al
    48.     add     al,30h      ; прибавляем к цифре 30h и получаем код этой цифры (0+30h=0, 1+30h=31h, 2+30h=32h и т.д.)
    49.     inc     ecx
    50.     mov     string[edi],al ; делаем обратный порядок чисел если в strin 12 то в max будет 21
    51.     cmp     ecx,len ; если достигаем последнего символа , то конец
    52.     jne     conv1
    53.     endm
    54. ;------------------------------------------------------------------------------------------------------------------------------------------        
    55. ;------------------------------------------------------------------------------------------------------------------------------------------
    56. addBCD  macro   s1,n1,s2,n2,sum,nsum
    57. local n1abov,n2abov,m1,m2,m3,m4,m5,neq,cf1,go0
    58. ; макрос сложения двух BCD чисел
    59. ; параметры : s1 -  первое слагаемое BCD число. n1-  количество символов в первом BCD числе.
    60. ; s2- второе слагаемое BCD число.  n2 -  количество символов во втором BCD числе.
    61. ; sum -  BCD число c результатом сложения.  nsum -  количество символов в BCD числе с результатом сложения.
    62. ; возвращает число в sum и колчество знаков в nsum
    63.     mov eax,n1
    64.     cmp eax,n2  ; сравниваем n1 и n2
    65.     jae n1abov
    66.     mov ecx,n1      ; n2>n1  перед сложением устанавливаем счетчик цикла на наименьшее количество разрядов в числе
    67.     mov edx,n2
    68.     sub edx,n1  ; вычисляем разницу между n1 и n2
    69.     xor ebx,ebx ; очистим ebx
    70.     xor eax,eax ; очистим аккумулятор
    71. m1:
    72.     mov al,s1[ebx]  ; берем разряд первого числа
    73.     adc al,s2[ebx]  ; складыаем с  этим же разрядом второго числа с учетом переноса
    74.     aaa             ; корректируем для представления в BCD
    75.     mov sum[ebx],al ; кидаем этот разряд в sum
    76.     inc ebx
    77.     loop    m1
    78.    
    79.     mov ecx,edx
    80. m2:
    81.     mov al,0    ; остальные разряды наименьшего числа - 0
    82.     adc al,s2[ebx]  ; складыаем с  этим же разрядом второго числа с учетом переноса
    83.     aaa             ; корректируем для представления в BCD
    84.     mov sum[ebx],al ; кидаем этот разряд в sum
    85.     inc ebx
    86.     loop    m2 
    87.    
    88.     jmp n2abov
    89. n1abov:
    90.     je  neq     ; если n1=n2 уходим на neq
    91.     mov ecx,n2  ; n1>n2 перед сложением устанавливаем счетчик цикла на наименьшее количество разрядов в числе   
    92.     mov edx,n1
    93.     sub edx,n2  ; вычисляем разницу между n1 и n2
    94.     xor ebx,ebx ; очистим ebx
    95.     xor eax,eax ; очистим аккумулятор
    96. m3:
    97.     mov al,s1[ebx]  ; берем разряд первого числа
    98.     adc al,s2[ebx]  ; складыаем с  этим же разрядом второго числа с учетом переноса
    99.     aaa             ; корректируем для представления в BCD
    100.     mov sum[ebx],al ; кидаем этот разряд в sum
    101.     inc ebx
    102.     loop    m3
    103.    
    104.     mov ecx,edx
    105. m4:
    106.     mov al,0    ; остальные разряды наименьшего числа - 0
    107.     adc al,s1[ebx]  ; складыаем с  этим же разрядом второго числа с учетом переноса
    108.     aaa             ; корректируем для представления в BCD
    109.     mov sum[ebx],al ; кидаем этот разряд в sum
    110.     inc ebx
    111.     loop    m4
    112.     jmp n2abov
    113.    
    114. neq:
    115.     mov ecx,n2  ; n1=n2 перед сложением устанавливаем счетчик цикла на  количество разрядов в числе   
    116.     xor ebx,ebx ; очистим ebx
    117.     xor eax,eax ; очистим аккумулятор
    118. m5:
    119.     mov al,s1[ebx]  ; берем разряд первого числа
    120.     adc al,s2[ebx]  ; складыаем с  этим же разрядом второго числа с учетом переноса
    121.     aaa             ; корректируем для представления в BCD
    122.     mov sum[ebx],al ; кидаем этот разряд в sum
    123.     inc ebx
    124.     loop    m5 
    125.    
    126. n2abov:
    127.     jc  cf1 ; был ли перенос в старший разряд
    128.             ; если не было то число разрядов на 1 меньше чем с переносом
    129.     mov nsum,ebx
    130.     jmp go0
    131. cf1:        ; если был перенос то учитываем его
    132.     mov sum[ebx],0
    133.     adc sum[ebx],0
    134.     inc ebx ; увеличиваем на 1 число разрядов
    135.     mov nsum,ebx   
    136. go0:
    137.     endm   
    138. ;------------------------------------------------------------------------------------------------------------------------------------------
    139.  
    140.  
    141. ;------------------------------------------------------------------------------------------------------------------------------------------
    142. ;------------------------------------------------------------------------------------------------------------------------------------------
    143.  
    144. reversBCD   macro   s1,n1
    145. local u1
    146. ; макрос производит реверс BCD числа s1 с количеством разрядов n1 (например 123 - 321,  1376 - 6731)
    147.     mov ecx,n1  ; в счетчик n1
    148.     xor ebx,ebx ; ebx очистить
    149.     xor eax,eax ; eax очистить
    150. u1:
    151.     dec ecx ; ecx-1
    152.     mov al,s1[ebx]  ; берем символ из начала
    153.     xchg    s1[ecx],al  ; меняем местами с последним
    154.     mov s1[ebx],al  ; кидаем в начало последний символ
    155.     inc ebx ; ebx+1
    156.     cmp ebx,ecx ; сравниваем ecx и ebx
    157.     jnae    u1  ; цикл работает пока ecx < ebx
    158.     endm
    159.  
    160. ;------------------------------------------------------------------------------------------------------------------------------------------
    161. ;------------------------------------------------------------------------------------------------------------------------------------------
    162. compareBCD  macro   s1,n1,s2,n2
    163. local p1,p2,p3
    164. ; макрос сравнивает два числа BCD s1 и s2 , если равны , то в аккумуляторе 1, иначе 0
    165.     mov eax,n1  ; сравниваем разряды чисел
    166.     cmp eax,n2
    167.     jne p2  ; если не равны разряды, то и числа не равны
    168.  
    169.     xor eax,eax ; чистим eax
    170.     mov ecx,n1  ; в счетчик кладем количество разрядов n1
    171. p1:
    172.     dec ecx ; уменьшаем ecx
    173.     mov al,s1[ecx]  ; берем символ из первого числа
    174.     cmp al,s2[ecx]  ; сравниваем его с символом из второго числа
    175.     jne p2  ; если не равны выходим из цикла
    176.     cmp ecx,0   ; крутимся в цикле пока ecx не 0
    177.     jne p1
    178.     mov eax,1   ; цикл закончился значит числа равны, в аккумулятор 1
    179.     jmp p3
    180. p2:
    181.     xor eax,eax ; если не равны в аккумулятор 0 
    182. p3:
    183.     endm
    184. ;------------------------------------------------------------------------------------------------------------------------------------------
    185. ;------------------------------------------------------------------------------------------------------------------------------------------
    186. equalBCD    macro   s1,n1,s2,n2
    187. local   a1
    188. ; макрос приравнивает два числа BCD s1 и s2 (оператор s1=s2, n1=n2),
    189.     xor ecx,ecx ; чистим ecx
    190.     xor eax,eax ; чистим eax
    191. a1:
    192.     mov al,s2[ecx]  ; берем символ из s2
    193.     mov s1[ecx],al  ; кидаем его в s1
    194.     inc ecx ; ecx+1
    195.     cmp ecx,n2  ; сравниваем ecx и n2
    196.     jne a1  ; пока не равны крутимся в цикле
    197.     mov eax,n2 
    198.     mov n1,eax  ; приравниваем n1 и n2
    199.     endm
    200. ;------------------------------------------------------------------------------------------------------------------------------------------
    201. ;*************************************************************************************************************************************
    202. ;*************************************************************************************************************************************
    203.  
    204. .data ; описание переменных
    205. hout    dd    0 ; дескриптор консоли для вывода
    206. hin     dd    0 ; дескриптор консоли для ввода
    207. strout1 db 'Џ®ЁбЄ Ї®«Ё­¤а®¬ , ¬Ґв®¤®¬ б㬬л зЁб«  б ҐЈ® ॢҐаᮬ',10,10,13,'‚ўҐ¤ЁвҐ зЁб«®?',10,13,0
    208. strout2 db    'Ќ ¦¬ЁвҐ Enter ¤«п ўл室 ',10,13,0
    209. strout3 db    '‚ўҐ¤Ґ­­®Ґ зЁб«® Ї «Ё­¤а®¬',10,10,13,0
    210. space   db  ' ',0  
    211. enterstr    db  10,13,0
    212. star    db  ' * ',0
    213. equalstr    db  ' = ',0
    214.  
    215.  
    216. x       db  10000   dup (0) ; число в BCD
    217. strx   db 10001 dup ('0') ; строка числа x
    218. nx  dd  1  ; количество символов в x
    219.  
    220. r       db  10000   dup (0) ; реверс числа x в BCD
    221. strr   db 10001 dup ('0') ; строка числа r
    222. nr  dd  1  ; количество символов в r
    223.  
    224.  
    225. .code ; сама программа
    226.  
    227. start:
    228.     call    AllocConsole    ;выделяем консольное окно
    229.    
    230.     call    GetStdHandle, 0FFFFFFF5h    ; получаем  дескриптор выходного буфера для консольного окна
    231.     mov    [hout], eax
    232.    
    233.     call    GetStdHandle, 0FFFFFFF6h    ; получаем  дескриптор входного буфера для консольного окна
    234.     mov     [hin], eax
    235.  
    236. beg:   
    237.     call    lstrlen, offset strout1
    238.     call    WriteConsoleA, [hout], offset strout1, eax, 0, 0    ; вывод сообщения
    239.    
    240.     call    lstrlen, offset strx
    241.     call    ReadConsoleA, [hin], offset strx, eax, offset nx, 0    ; ввод числа
    242.  
    243.    
    244.     sub     nx,2    ; не учитываем символы 10 и 13    
    245.     strtoint    strx,x,nx   ; переводим строку x в BCD число x
    246.    
    247.     equalBCD    r,nr,x,nx   ; r=x
    248.     reversBCD   r,nr    ; реверс числа r
    249.     compareBCD  r,nr,x,nx   ; сравниваем r и x
    250.     cmp eax,1
    251.     jne mcicle  ; если не равны т.е. число не палиндром уходим на основной цикл
    252.    
    253.     call    lstrlen, offset strout3 ;  если равны выводим сообщение и на начало  программы
    254.     call    WriteConsoleA, [hout], offset strout3, eax, 0, 0    ; вывод сообщения
    255.     jmp beg
    256.    
    257.    
    258. mcicle:
    259.     addBCD  x,nx,r,nr,x,nx  ; x=x+r
    260.     equalBCD    r,nr,x,nx   ; r=x
    261.     reversBCD   r,nr    ; реверс числа r
    262.     compareBCD  r,nr,x,nx   ; сравниваем r и x
    263.     cmp eax,1
    264.     jne mcicle  ; если не равны т.е. число не палиндром крутимся в  цикле
    265.    
    266.     inttostr    x,strx,nx   ; переводим число x в строку strx
    267.    
    268.     call    lstrlen, offset strx
    269.     call    WriteConsoleA, [hout], offset strx, eax, offset nx, 0    ; вывод сообщения
    270.     call    lstrlen, offset enterstr
    271.     call    WriteConsoleA, [hout], offset enterstr, eax, 0, 0    ; вывод сообщения
    272.    
    273.     call    lstrlen, offset strout2
    274.     call    WriteConsoleA, [hout], offset strout2, eax, 0, 0    ; вывод сообщения
    275.    
    276.     call    lstrlen, offset strx
    277.     call    ReadConsoleA, [hin], offset strx, eax, 0, 0    ;  ожидание нажатия enter    
    278.    
    279.     call    ExitProcess, 0    ; выход из прогрраммы
    280.    
    281.    
    282. end    start
     
  2. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.231
    andrey6lp
    Было бы неплохо если бы ты указал строку на которую ругается компилятор, а пока не хватает строки
    Код (Text):
    1. includelib import32.lib
    чтобы линковщик знал откуда взять API-функции: AllocConsole, ExitProcess, GetStdHandle, WriteConsoleA, ReadConsoleA и lstrlen и поставь нормальную кодировку, хотя бы в комментариях, что же это за strout1, strout2 и strout3?
     
  3. andrey6lp

    andrey6lp New Member

    Публикаций:
    0
    Регистрация:
    1 июн 2009
    Сообщения:
    2
    strout1 db 'Поиск полиндрома, методом суммы числа с его реверсом',10,10,13,'Введите число?',10,13,0
    strout2 db 'Нажмите Enter для выхода',10,13,0
    strout3 db 'Введенное число палиндром',10,10,13,0

    Поставил
    Код (Text):
    1. includelib import32.lib
    всё равно не пашет(((
     
  4. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.231
    andrey6lp
    А путь к import32.lib линковщик знает? :)
     
  5. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    TASM?
    Добавь в командную стоку линкера "/3" или собирай при помощи tlink32.