Ассемблер
В настоящее время широко применяются архитектуры процессоров x86 и ARM. Программа на языке ассемблера для RISC-процессоров ARM может быть распознана по характерным командам LDR (load register), STR (store register) для загрузки данных из памяти в регистр и обратно. Векторные варианты данных инструкций содержат префикс 'V' (VLDR, VSTR). В программах для архитектуры x86 таких команд нет. Ассемблерные программы для процессоров x86 (Intel, AMD, Cyrix) могут быть записаны в синтаксисе Intel или AT&T, рассчитаны на 16, 32 или 64-битную архитектуру, использовать FPU (сопроцессор для вычислений с плавающей запятой) или нет. Определять разрядность в данной задаче будем следующим образом. Если в тексте программы встречаются 64-битные регистры (rax, rbx, rcx, rdx, rsp, rbp, rsi, rdi), то считаем, что архитектура 64-разрядная. Если 64-битные регистры не используются, но встречаются 32-битные (eax, ebx, ecx, edx, esp, ebp, esi, edi), то считаем, что архитектура 32-разрядная. Если нет ни 64-битных, ни 32-битных регистров, то полагаем, что архитектура 16-разрядная. Синтаксис AT&T можно опознать по символу '%' перед регистрами (например, %esp, %bp). В синтаксисе Intel перед названием регистров спецсимволов нет. Если в программе не встречается ни одного регистра, то предполагается синтаксис Intel. Для распознавания работы с FPU в данной задаче ограничимся тремя командами: finit (проинициализировать FPU), fld (загрузить данные в сопроцессор) и fst (выгрузить данные из сопроцессора). Вам дан фрагмент программы на ассемблере, требуется определить для него вышеописанные характеристики. При решении данной задачи можно считать, что верны следующие допущения: - все используемые в программе идентификаторы (названия регистров, команд, процедур и т.д.) могут содержать только заглавные и строчные латинские буквы, цифры, символы '_' (подчеркивание), '.' (точка) и не могут начинаться с цифры; - в программах для архитектуры x86 не встречается идентификаторов с именами LDR, STR, VLDR, VSTR (в любом регистре); - в тексте программ не встречается комментариев; - в тексте программ возможны строковые константы, которые записываются в двойных кавычках (символ "). Они могут содержать произвольный текст, который никак не влияет на ответ. Внутри строковых констант символ " не встречается; - регистр символов не учитывается. Входные данные представляют собой фрагмент программы на языке ассемблера. Выходные данные: вначале выведите целое число 86 (если обнаружена архитектура x86) либо 0 (если обнаружена архитектура ARM). В случае x86 выведите ещё три целых числа, разделяя их пробелом: - 1, если используется синтаксис AT&T, и 0, если Intel; - 1, если используется FPU, и 0, если нет; - 16, 32 или 64 — максимальная обнаруженная разрядность. В случае архитектуры ARM выведите 1, если используются векторные инструкции, и 0, если нет. Примеры
| |||||||||||||||||
|