组装文件时获取0xBAADF00D并且未获取所有数据

问题描述 投票:0回答:1

我在 logisim 中制作了一台 16 位计算机,并想为其汇编一些代码,但是当我没有获得所有数据时,我得到了 BAAD FOOD BAAD FOOD BAAD 我的汇编代码是:

ADD 3 3 3
我想得到: 1300 0003 0003 0003 但我明白了 1300 0003 0003 巴德 F00D 巴德 F00D 巴德 我的代码是:

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

typedef struct Node {
    int16_t value;
    struct Node* next;
} Node;

int linkedListSize(Node* start){
    int size = 0;
    Node* curr = start;
    while (curr!= NULL){
        size++;
        if (curr -> next == 0xbaadf00dbaadf00d) break;
        curr = curr->next;
    }
    return size;
}

int isDigit(char *string, int size){
    char *digits = "0123456789";
    for (int i = 0; i < size; i ++){
        int in = 0;
        for (int x = 0; x < 10; x ++){
            if (string[i] == digits[x]){
                in = 1;
                break;
            }
        }
        if (in == 0){
            return 0;
        }
    }
    return 1;
}

// Corrected to accept the length of the string as an argument
int toDigit(char *string, int len){
    char *digits = "0123456789";
    int value = 0;
    int neg = string[0] == '-';
    for (int i = neg; i < len; i++){
        for (int x = 0; x < 10; x++){
            if (string[i] == digits[x]){
                value *= 10;
                value += x;
                break;
            }
        }
    }
    if (neg) value = -value;
    return value;
}

// Corrected to return a dynamically allocated array
int16_t* makeLikedList(Node* start){
    int size = linkedListSize(start);
    int16_t *list = (int16_t *)malloc(size * 16);

    int idx = 0;
    Node* curr = start;
    while (curr != NULL){
        if (curr -> next == 0xbaadf00dbaadf00d) break;
        list[idx] = curr->value;
        idx ++;
        curr = curr->next;
    }
    return list;
}

// Corrected loop condition
char *stringToYFromX(char *string, int x, int y){
    char *newString = (char *)malloc(y-x+1); // Allocate space for the null terminator
    for (int i = x; i < y; i++){
        newString[i-x] = string[i];
    }
    newString[y-x] = '\0'; // Ensure the string is null-terminated
    return newString;
}

int main(int argc, char *argv[]){
    if (argc!= 3){
        printf("Error: invalid args\n");
        return 1;
    }
    FILE *assemblyFile;
    int assemblySize;
    char *assemblyCode;
    assemblyFile = fopen(argv[1],"rb");
    
    fseek(assemblyFile, 0, SEEK_END); 
    assemblySize = ftell(assemblyFile);
    fseek(assemblyFile, 0, SEEK_SET); 

    assemblyCode = (char*) malloc(assemblySize + 1);
    fread(assemblyCode, 1, assemblySize, assemblyFile);
    assemblyCode[assemblySize] = '\0';   

    FILE *binFile;
    Node* binListStart = (Node*)malloc(sizeof(Node));
    binFile = fopen(argv[2],"wb");

    char *curr;
    int currSize = 0;
    int currStart = 0;
    int count = 0;
    Node* opNode;
    Node* currNode = binListStart;
    for (int i = 0; i < assemblySize; i ++){
        if (assemblyCode[i] == ' '){
            count += 1;
            if ((count - 1) % 4 == 0){
                opNode = currNode;
            }
            curr = (char*) malloc(currSize + 1);
            for (int x = 0; x < currSize; x++){
                curr[x] = assemblyCode[currStart+x];
            }
            curr[currSize] = '\0';
            if (strcmp(curr,"ADD")==0){
                currNode -> value = 0x1000;
                currNode->next = (Node*)malloc(sizeof(Node));
            } else if (strcmp(curr,"SUB")==0){
                currNode -> value = 0x1001;
                currNode->next = (Node*)malloc(sizeof(Node));
            } else if (strcmp(curr,"MUL")==0){
                currNode -> value = 0x1002;
                currNode->next = (Node*)malloc(sizeof(Node));
            } else if (strcmp(curr,"DIV")==0){
                currNode -> value = 0x1003;
                currNode->next = (Node*)malloc(sizeof(Node));
            } else if (strcmp(curr,"MOD")==0){
                currNode -> value = 0x1004;
                currNode->next = (Node*)malloc(sizeof(Node));
            } else if (strcmp(curr,"SHL")==0){
                currNode -> value = 0x1005;
                currNode->next = (Node*)malloc(sizeof(Node));
            } else if (strcmp(curr,"SHR")==0){
                currNode -> value = 0x1006;
                currNode->next = (Node*)malloc(sizeof(Node));
            } else if (strcmp(curr,"ASHR")==0){
                currNode -> value = 0x1008;
                currNode->next = (Node*)malloc(sizeof(Node));
            } else if (strcmp(curr,"RSHL")==0){
                currNode -> value = 0x1009;
                currNode->next = (Node*)malloc(sizeof(Node));
            } else if (strcmp(curr,"RSHR")==0){
                currNode -> value = 0x100a;
                currNode->next = (Node*)malloc(sizeof(Node));
            } else if (strcmp(curr,"AND")==0){
                currNode -> value = 0x100b;
                currNode->next = (Node*)malloc(sizeof(Node));
            } else if (strcmp(curr,"OR")==0){
                currNode -> value = 0x100c;
                currNode->next = (Node*)malloc(sizeof(Node));
            } else if (strcmp(curr,"XOR")==0){
                currNode -> value = 0x100d;
                currNode->next = (Node*)malloc(sizeof(Node));
            } else if (strcmp(curr,"NOT")==0){
                currNode -> value = 0x100e;
                currNode->next = (Node*)malloc(sizeof(Node));
            } else if (strcmp(curr,"NAND")==0){
                currNode -> value = 0x100f;
                currNode->next = (Node*)malloc(sizeof(Node));
            } else if (strcmp(curr,"NOR")==0){
                currNode -> value = 0x1010;
                currNode->next = (Node*)malloc(sizeof(Node));
            } else if (strcmp(curr,"XNOR")==0){
                currNode -> value = 0x1011;
                currNode->next = (Node*)malloc(sizeof(Node));
            } else if (strcmp(curr,"JE")==0){
                currNode -> value = 0x2000;
                currNode->next = (Node*)malloc(sizeof(Node));
            } else if (strcmp(curr,"JNE")==0){
                currNode -> value = 0x2001;
                currNode->next = (Node*)malloc(sizeof(Node));
            } else if (strcmp(curr,"JL")==0){
                currNode -> value = 0x2002;
                currNode->next = (Node*)malloc(sizeof(Node));
            } else if (strcmp(curr,"JG")==0){
                currNode -> value = 0x2003;
                currNode->next = (Node*)malloc(sizeof(Node));
            } else if (strcmp(curr,"JLE")==0){
                currNode -> value = 0x2004;
                currNode->next = (Node*)malloc(sizeof(Node));
            } else if (strcmp(curr,"JGE")==0){
                currNode -> value = 0x2005;
                currNode->next = (Node*)malloc(sizeof(Node));
            } else if (strcmp(curr,"LOAD")==0){
                currNode -> value = 0x3000;
                currNode->next = (Node*)malloc(sizeof(Node));
            } else if (strcmp(curr,"MOV")==0){
                currNode -> value = 0x3001;
                currNode->next = (Node*)malloc(sizeof(Node));
            } else if (strcmp(curr,"RLD")==0){
                currNode -> value = 0x4000;
                currNode->next = (Node*)malloc(sizeof(Node));
            } else if (strcmp(curr,"RMV")==0){
                currNode -> value = 0x4001;
                currNode->next = (Node*)malloc(sizeof(Node));
            } else if (strcmp(curr,"RGT")==0){
                currNode -> value = 0x4002;
                currNode->next = (Node*)malloc(sizeof(Node));
            } else if (strcmp(curr,"PUSH")==0){
                currNode -> value = 0x5000;
                currNode->next = (Node*)malloc(sizeof(Node));
            } else if (strcmp(curr,"POP")==0){
                currNode -> value = 0x5001;
                currNode->next = (Node*)malloc(sizeof(Node));
            } else if (isDigit(curr,currSize) == 1){
                if ((count - 1) % 4 == 0){
                    printf("Error: invalid token\ntoken number: %d\ntoken: %s",count,curr);
                    return 1;
                }
                switch ((count - 1) % 4)
                {
                case 1:
                    opNode->value += 0x0100;
                    break;
                case 2:
                    opNode->value += 0x0200;
                    break;
                }
                currNode -> value = toDigit(curr,currSize);
                currNode->next = (Node*)malloc(sizeof(Node));
            } else if (curr[0] == 'r'){
                curr = stringToYFromX(curr,1,currSize);
                if ((count - 1) % 4 == 3 && isDigit(curr,currSize) == 0){
                    printf("Error: invalid token\ntoken number: %d\ntoken: r%s",count,curr);
                    return 1;
                }
                currNode -> value = toDigit(curr,currSize);
                currNode->next = (Node*)malloc(sizeof(Node));
            } else {
                printf("Error: invalid token\ntoken number: %d\ntoken: %s",count,curr);
                return 1;
            }
            currNode = currNode -> next;
            curr = NULL;
            currSize = 0;
            currStart = i+1;
        }
        else{
            currSize ++;
        }
    }
    fwrite(makeLikedList(binListStart), sizeof(int), linkedListSize(binListStart), binFile);
    fclose(assemblyFile);
    fclose(binFile);
}

我尝试添加缓冲区来阻止链表函数中的 baadfood。 BAADf00D 似乎也是 Null 的意思。

c
1个回答
0
投票

好吧,你只需要做一件事就可以让它不崩溃。

主要就在你之后:

currNode = currNode -> next;

您还需要添加:

currNode -> next = NULL;

这样下一项就指向 NULL。 如果不这样做,它将指向一个随机位置。 在你的非发布编译中哪个是 0xBAADFOOD

然后,如果你打开内存地址清理器,它会抱怨你拥有的所有内存都没有被

malloc
d。所以,你也需要这样做。
这是工作副本:

https://onlinegdb.com/-SnvBEZUa8

© www.soinside.com 2019 - 2024. All rights reserved.