Дизассемблирование - fica99/Corewar GitHub Wiki
Дизассемблер выполняет задачу, противоположную задаче asm
— переводит байт-код обратно на язык ассемблера.
Важно понимать, что «восстановленный» файл не будет на 100% соответствовать исходному.
Ведь в .cor
файле нет информации о комментариях, которые игнорируются при трансляции, а также об именах меток, которые в процессе обработки заменяются на числовые эквиваленты.
Поэтому файл, который изначально выглядел так ...:
.name "Batman"
.comment "This city needs me"
loop:
sti r1, %:live, %1
live:
live %0
ld %0, r2
zjmp %:loop
... после «восстановления» из байт-кода будет выглядеть немного иначе:
.name "Batman"
.comment "This city needs me"
sti r1, %7, %1
live %0
ld %0, r2
zjmp %-19
Библиотека libdisasm
t_champ *validate_and_parse(char *filename);
#include "libdisasm.h"
библиотека libdisasm
Функция валидирует и парсит .cor файл. В случае ошибки возвращает NULL и печатает сообщение в стандартный поток ошибок.
Принимает имя файла.
Возвращает указатель на структуру t_champ
typedef struct s_champ
{
`unsigned id; // идентификационный номер `
`unsigned char *name; // имя чемпиона `
`unsigned char *comment; // комментарий чемпиона `
`size_t exec_code_size; // размер исполняемого кода в байтах `
`t_op *exec_code; // список команд и аргументов `
}t_champ;
ПОЛЕ id ОСТАЕТСЯ НЕЗАПОЛНЕННЫМ Т.К. ИДЕНТИФИКАЦИОННЫЙ НОМЕР ПРИСВАИВАЕТСЯ ВИРТУАЛЬНОЙ МАШИНОЙ ВО ВРЕМЯ ПАРСИНГА АРГУМЕНТОВ
Содержимое структуры t_op:
typedef struct s_op
{
char *name; // Имя операции
uint8_t code; // Код операции
uint8_t args_num; // Количество аргументов
t_bool args_types_code; // Есть ли байт типов аргументов
uint8_t args_types[3]; // Типы аргументов (T_IND, T_REG, T_DIR)
uint8_t t_dir_size; // размер аргумента T_DIR
int32_t args_val[3]; // Значения аргументов операции
struct s_op *next; // Указатель на след операцию
} t_op;
Функция void free_champ(t_champ *ch)
фришит структуру чемпиона