Дизассемблирование - 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) фришит структуру чемпиона