fasm: code cannot be generated

Тема в разделе "WASM.ASSEMBLER", создана пользователем gevara, 4 дек 2006.

  1. gevara

    gevara максим

    Публикаций:
    0
    Регистрация:
    10 ноя 2006
    Сообщения:
    112
    Адрес:
    г. Пермь
    при компиляции возникает ошибка: code cannot be generated. пробовал и memory увеличивать и priority. ничего. убираю одну комманду - всё замечательно: 3 passes, 2048 bytes. как бать? у меня такое впервые, да и в документации ничего путнего не нашёл. а может я просто плохо в английском разбираюсь. при компиляции из comline:

    fasm.exe E:\fasm164\mysource\2.asm 2.exe
    flat assembler version 1.67.14 (589664 kilobytes memory)
    error: code cannot be generated.

    { откуда там берётся 589664 байт? прога всего 2 кило.}

    или:

    fasm.exe -m 65536 E:\fasm164\mysource\2.asm 2.exe
    flat assembler version 1.67.14 (65536 kilobytes memory)
    error: code cannot be generated.
     
  2. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    gevara
    У меня такое выдаёт когда в макросах ошибки.
     
  3. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    fasm.pdf -> 65 страница, глава 2.2.6 - Мультипроходность.


    ...
    The solution may sometimes not exist and in such cases the assembler
    will never manage to make correct predictions – for this reason there is a
    limit for a number of passes, and when assembler reaches this limit, it stops
    and displays the message that it is not able to generate the correct output
    .
    Consider the following example:
    if ~ defined alpha
    alpha:
    end if

    The defined operator gives the true value when the expression following it
    couldbecalculatedinthisplace, whatinthiscasemeansthatthealphalabel
    is defined somewhere. But the above block causes this label to be defined
    only when the value given by defined operator is false, what leads to an
    antynomy and makes it impossible to resolve such code. When processing
    the if directive assembler has to predict whether the alpha label will be
    defined somewhere (it wouldn’t have to predict only if the label was already
    defined earlier in this pass), and whatever the prediction is, the opposite
    always happens. Thus the assembly will fail, unless the alpha label is defined
    somewhere in source preceding the above block of instructions
    – in such case,
    as it was already noted, the prediction is not needed and the block will just
    get skipped.
    ...



    это один из вариантов.

    исходный код может помочь.
     
  4. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    макросы - работы препроцессора. Препроцессор код не генерирует.(у него только работы со строками)

    это ошибка уже после стадии препроцессинга(вроде бы, хотя могу и ошибаться).
     
  5. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    dead_body
    Генерирует, но не машинный, а "ассемблерный".
     
  6. gevara

    gevara максим

    Публикаций:
    0
    Регистрация:
    10 ноя 2006
    Сообщения:
    112
    Адрес:
    г. Пермь
    я пишу почти без макросов. удинственное - equ и $. но как обьяснить, что при удалении ЛЮБОЙ комманды - всё компилируется нормально. мне нужен совет. Исходники выложить не могу. там всё просто:

    section 'code' readable writable executable
    strt:
    ...
    align 0x400
    buff rb 0x1000

    P.S.
    странно. перекинул некоторые данные из конца проги - в начало (строки и дворды) => все заработало. там данные статические. адресуются через смещение относительно ebx. хотя, это тут причём?... видимо, всё-таки, проблеммы с кодогенерацией.
     
  7. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Это не глюки с макросами/в исходнике, это принципиальная недоработка FASM'а.
    Точно такая же ошибка проявляется на таком коде:
    Код (Text):
    1. use32
    2.         mov     ebx, a
    3.         mov     ecx, [ebx + b - a]
    4.  
    5. rb 0x378
    6. a:
    7. align 0x400
    8. b:
    Проблема в том, что FASM пытается сгенерировать оптимальный код. Адресация [ebx+delta] может кодироваться разными по длине способами: общий длинный - хранится 4-байтовое значение delta, и частный короткий - для случая -0x80 <= delta <= 0x7F. На первом проходе FASM отводит 6 = 2+4 байт под вторую инструкцию mov, исходя из худшего. При этом оказывается, что delta=b-a оказывается коротким. На втором проходе FASM с учетом этого отводит 3 = 2+1 байт под вторую инструкцию mov, но в результате delta=b-a меняется, переходя границу 0x7F! (Число 0x378 именно так и подобрано). Так что ассемблеру приходится делать третий проход, на котором он вновь считает, что delta длинное, ну и так потенциально бесконечно долго, фактически - пока не кончится лимит проходов.
    Один из вариантов исправления:
    Код (Text):
    1. use32
    2.         mov     ebx, a
    3.         mov     ecx, [dword ebx + b - a]
    4.  
    5. rb 0x378
    6. a:
    7. align 0x400
    8. b:
    Теперь FASM не умничает и всегда генерирует длинный вариант.
     
  8. gevara

    gevara максим

    Публикаций:
    0
    Регистрация:
    10 ноя 2006
    Сообщения:
    112
    Адрес:
    г. Пермь
    diamond

    спасибо. это больше похоже на правду.