Обнаружил занятный баг у flat assembler 1.56 Он компилирует "невозможные" инструкции setc eax setc ax в setc al даже не думая сообщать об ошибке. Более того setc esi setc si он компилирует в setc dh. И т.д.... Будьте бдительны
IMHO вопрос неоднозначный. В книге двойных слов написано следующее: SETcc - Set Byte on Condition. Таким образом setc eax и setc ax выглядят вполне логично - устанавлисвается байт указанного регистра. К примеру, если операнд в памяти, ни у кого не вызывает удивления, что можно изменить байт у DWORD'а. Другой пример - опкод A8 08 традиционно интерпретируется как test al,8. хотя можно доказать, что это test eax,8 В случае с setc esi, конечно, всё выглядит совершенно иначе.. Вообще, дучше писать про баги FASM на форуме, т.к. Privalov здесь не частый гость.
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." А Привалову я еще вчера написал
Как известно, регистры кодируются следующим образом Код (Text): 000 AL AX EAX 001 CL CX ECX 010 DL DX EDX 011 BL BX EBX 100 AH SP ESP 101 CH BP EBP 110 DH SI ESI 111 BH DI EDI Какой конкретно регистр имеется в виду, определяется разрядностью операнда. Ошибка, о которой идёт речь, весьма распространена. Компилятор правильно определяет по имени регистра его трёхбитный код, но не проверяет допустимость конкретной разрядности. Из таблицы видно, почему esi и si "превращаются" в dh.