setc eax Flat Assembler 1.56 bug

Тема в разделе "WASM.ASSEMBLER", создана пользователем Gray, 26 окт 2004.

  1. Gray

    Gray New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2004
    Сообщения:
    75
    Адрес:
    Russia
    Обнаружил занятный баг у flat assembler 1.56

    Он компилирует "невозможные" инструкции

    setc eax

    setc ax

    в setc al даже не думая сообщать об ошибке.

    Более того

    setc esi

    setc si

    он компилирует в setc dh. И т.д....



    Будьте бдительны :)
     
  2. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    IMHO вопрос неоднозначный.

    В книге двойных слов написано следующее:

    SETcc - Set Byte on Condition.

    Таким образом setc eax и setc ax выглядят вполне логично - устанавлисвается байт указанного регистра.

    К примеру, если операнд в памяти, ни у кого не вызывает удивления, что можно изменить байт у DWORD'а.

    Другой пример - опкод A8 08 традиционно интерпретируется как test al,8. хотя можно доказать, что это test eax,8 :derisive:



    В случае с setc esi, конечно, всё выглядит совершенно иначе..

    Вообще, дучше писать про баги FASM на форуме, т.к. Privalov здесь не частый гость.
     
  3. Gray

    Gray New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2004
    Сообщения:
    75
    Адрес:
    Russia
    S_T_A_S_, процитирую "IA-32 Intel Architecture Software Developer’s Manual Volume 2: Instruction Set Reference"

    Вот что там написано о SETcc: "The destination operand points to a _byte_ register or a byte in memory."



    А Привалову я еще вчера написал :)
     
  4. captain cobalt

    captain cobalt New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2003
    Сообщения:
    222
    Адрес:
    /ru/perm
    Как известно, регистры кодируются следующим образом
    Код (Text):
    1. 000  AL AX EAX
    2. 001  CL CX ECX
    3. 010  DL DX EDX
    4. 011  BL BX EBX
    5. 100  AH SP ESP
    6. 101  CH BP EBP
    7. 110  DH SI ESI
    8. 111  BH DI EDI


    Какой конкретно регистр имеется в виду, определяется разрядностью операнда.



    Ошибка, о которой идёт речь, весьма распространена. Компилятор правильно определяет по имени регистра его трёхбитный код, но не проверяет допустимость конкретной разрядности.



    Из таблицы видно, почему esi и si "превращаются" в dh.