Преобразование команды перехода сборки в ее шестнадцатеричное значение в C - PullRequest
0 голосов
/ 20 октября 2019

Я пытаюсь создать ассемблер в c, который просто читает инструкции из входного файла, а затем переводит их в машинный / шестнадцатеричный код. Пока все хорошо, пока я не нажму инструкцию перехода, в то время как она у меня есть, чтобы она правильно переводила гекс в случае jump 24 в c0 00 00 18, и я не уверен, как правильно проверить эти 00 без жесткого кодирования. Какя могу сделать это? Должен ли я использовать смены?

PR1.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char *ltrim(char *s) {
    while (*s == ' ' || *s == '\t') s++;
    return s;
}

char getRegister(char *text) {
    if (*text == 'r' || *text=='R') text++;
    return atoi(text);
}

char getHex(char *text){
    int number = (int)strtol(text, NULL, 16);
    char reservednum[5];
    if(number <= 0xFFFF){
        sprintf(&reservednum[0], "%04x", number);
    }
    return atoi(reservednum);
}

int assembleLine(char *text, unsigned char* bytes) {
    text = ltrim(text);
    char *keyWord = strtok(text," ");
    if (strcmp("add",keyWord) == 0) {
        bytes[0] = 0x10;
        bytes[0] |= getRegister(strtok(NULL," "));
        bytes[1] = getRegister(strtok(NULL," ")) << 4 | getRegister(strtok(NULL," "));
        return 2;
    }
    else if(strcmp("subtract", keyWord) == 0){
        bytes[0] = 0x50;
        bytes[0] |= getRegister(strtok(NULL, " "));
        bytes[1] = getRegister(strtok(NULL, " ")) << 4 | getRegister(strtok(NULL, " "));
        return 2;
    }
    else if(strcmp("and", keyWord) == 0){
        bytes[0] = 0x20;
        bytes[0] |= getRegister(strtok(NULL, " "));
        bytes[1] = getRegister(strtok(NULL, " ")) << 4 | getRegister(strtok(NULL, " "));
        return 2;
    }
    else if(strcmp("divide", keyWord) == 0){
        bytes[0] = 0x30;
        bytes[0] |= getRegister(strtok(NULL, " "));
        bytes[1] = getRegister(strtok(NULL, " ")) << 4 | getRegister(strtok(NULL, " "));
        return 2;
    }
    else if(strcmp("multiply", keyWord) == 0){
        bytes[0] = 0x40;
        bytes[0] |= getRegister(strtok(NULL, " "));
        bytes[1] = getRegister(strtok(NULL, " ")) << 4 | getRegister(strtok(NULL, " "));
        return 2;
    }
    else if(strcmp("or", keyWord) == 0){
        bytes[0] = 0x60;
        bytes[0] |= getRegister(strtok(NULL, " "));
        bytes[1] = getRegister(strtok(NULL, " ")) << 4 | getRegister(strtok(NULL, " "));
        return 2;
    }
    else if(strcmp("halt", keyWord) == 0){
        bytes[0] = 0x00;
        bytes[1] = 0x00;
        return 2;
    }
    else if(strcmp("return", keyWord) == 0){
        bytes[0] = 0x70;
        bytes[1] = 0x00;
        return 2;
    }
    else if(strcmp("addimmediate", keyWord) == 0){
        bytes[0] = 0x90;
        bytes[0] |= getRegister(strtok(NULL, " "));
        bytes[1] = getHex(strtok(NULL, " "));
        return 2;
    }
    else if(strcmp("interrupt", keyWord) == 0){
        bytes[0] = 0x80;
        bytes[0] |= getHex(strtok(NULL, " "));
        bytes[1] = 0x00;
        return 2;
    }
    else if(strcmp("push", keyWord) == 0){
        bytes[0] = 0x70;
        bytes[0] |= getRegister(strtok(NULL, " "));
        bytes[1] = 0x40;
        return 2;
    }
    else if(strcmp("pop", keyWord) == 0){
        bytes[0] = 0x70;
        bytes[0] |= getRegister(strtok(NULL, " "));
        bytes[1] = 0x80;
        return 2;
    }
    else if(strcmp("load", keyWord) == 0){
        bytes[0] = 0xE0;
        bytes[0] |= getRegister(strtok(NULL, " "));
        bytes[1] = getRegister(strtok(NULL, " ")) << 4 | getHex(strtok(NULL, " "));
        return 2;
    }
    else if(strcmp("store", keyWord) == 0){
        bytes[0] = 0xF0;
        bytes[0] |= getRegister(strtok(NULL, " "));
        bytes[1] = getRegister(strtok(NULL, " ")) << 4 | getHex(strtok(NULL, " "));
        return 2;
    }
    else if(strcmp("jump", keyWord) == 0){
        bytes[0] = 0xC0;
        bytes[1] = 0x00;
        bytes[2] = 0x00;
        bytes[3] = getHex(strtok(NULL, " "));
        return 4;
    }
}

int main(int argc, char **argv) {
    FILE *src = fopen(argv[1],"r");
    FILE *dst = fopen(argv[2],"w");
    while (!feof(src)) {
        unsigned char bytes[4];
        char line[1000];
        if (NULL != fgets(line, 1000, src)) {
            printf ("read: %s\n",line);
            int byteCount = assembleLine(line,bytes);
            fwrite(bytes,byteCount,1,dst);
        }
    }
    fclose(src);
    fclose(dst);
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...