В настоящее время широко применяются архитектуры
процессоров 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, если нет.
Примеры
Входные данные
|
Выходные данные
|
Finit
xor
%rax, %rbx
|
86
1 1 64
|
.LC1:
.string "xor rax, rbx"
mov
ecx, edx
mov
eax, 1
mul
ecx
add
ah, al
|
86
0 0 32
|
LDR
R1, Value
|
0
0
|
vldr
R1, Value
|
0
1
|