#include #include #include #include #include #include typedef struct field field; struct field { const char *byte_name; const char *word_name; unsigned short bits[3]; }; const int FIELDS_COUNT = 8; field fields[FIELDS_COUNT] { {"ax", "al", {0, 0, 0}}, {"si", "cl", {0, 0, 1}}, {"dx", "dl", {0, 1, 0}}, {"bx", "bl", {0, 1, 1}}, {"sp", "ah", {1, 0, 0}}, {"bp", "ch", {1, 0, 1}}, {"si", "dh", {1, 1, 0}}, {"di", "bh", {1, 1, 1}}, }; const char *get_field(unsigned short bits[3], unsigned short w) { for(int index = 0; index < FIELDS_COUNT; ++index) { if(!w) { if(memcmp(bits, fields[index].bits, 3) == 0) { return fields[index].byte_name;} } else { if(memcmp(bits, fields[index].bits, 3) == 0) { return fields[index].word_name;} } } } typedef struct inst inst; struct inst { const char *instruction; unsigned short bits[8]; }; const int INST_COUNT = 3; const inst instructions[INST_COUNT] { {"mov", {1, 0, 0, 0, 1, 0}}, {"add", {}}, {"sub", {}}, }; int main(int argc, char **argv) { if(argc <= 1) { return 1;} struct stat sb; if (lstat(argv[1], &sb) == -1) { perror("lstat"); exit(EXIT_FAILURE); } size_t size = sb.st_size; char *buffer = (char *)malloc(size); int fd = open(argv[1], O_RDONLY); size_t read_count = read(fd, buffer, size); if(read_count != size) { printf("i think this is an error"); return 1; } for(int index = 0; index != size; ++index) { char *line = (char *)malloc(8); unsigned char byte = (unsigned char)buffer[index]; for(int pos = 7; pos >= 0; --pos) { line[pos] = (byte >> pos) & 1 ? '1' : '0'; } // check for mov instruction { bool result = true; for(int regular = 0, reverse = 5; regular < 5, reverse >= 0; ++regular, --reverse) { if(line[reverse] - '0' != instructions[0].bits[regular]) { result = false; } } if(result) { printf("mov\n");} } // check for second 8 bits { bool result = true; int field_index = 0; for(int field_idx = 0; field_idx < FIELDS_COUNT; ++field_idx) { unsigned short d = 0; unsigned short w = 0; for(int regular = 0, reverse = 5; regular < 5, reverse >= 0; ++regular, --reverse) { if(line[reverse] - '0' != fields[field_idx].bits[regular]) { result = false; } } if(result) { printf(" %s,", get_field(fields[field_idx], 2)); } } } free(line); } free(buffer); close(fd); return 0; }