1

我有一个项目需要我们作为程序员,将一行汇编语言翻译成机器语言并计算小数。我们有自己的带有操作码的示例计算机,以使其更易于计算。我的问题是以下功能是否符合我的目标。

在主函数中,我有一个标记为 char binary[3] 的字符数组,因为返回的值将是三位。此外,函数中有一个字符操作码[MAXLINELENGTH],它从文件中正确读取操作码行,因此我在函数中用 *string 指向它。这会正确找到匹配项并用正确的 3 位代码填充 main 中的二进制数组吗?

//function should return true if the proper binary output was successfuly copied with the matching opcode
int opcodeBinary(char *string,char *binary){
    if(strncmp(*string,"add"){
        *binary="000";
        return 1;
    }
    else if(strncmp(*string,"nand"){
        *binary="001";
        return 1;
    }
    else if(strncmp(*string,"lw"){
        *binary="010";
        return 1;
    }
    else if(strncmp(*string,"sw"){
        *binary="011";
        return 1;
    }
    else if(strncmp(*string,"beq"){
        *binary="100";
        return 1;
    }
    else if(strncmp(*string,"jalr"){
        *binary="101";
        return 1;
    }
    else if(strncmp(*string,"halt"){
        *binary="110";
        return 1;
    }
    else if(strncmp(*string,"noop"){
        *binary="111";
        return 1;
    }
    else{
        return 0;
    }
}
4

3 回答 3

2

不——事实上,它甚至不应该编译。(您是否在将代码发布到此处之前尝试编译代码?)

strncmpstrcmp如果字符串相等则返回 0(并且接受strncmp三个参数,而不是两个!)。要比较两个字符串是否相等,您需要以下内容:

if (strncmp(string, "nand", 4) == 0) {
    ...

或者,更简单地说:

if (strcmp(string, "nand") == 0) {
    ...

由于字符串文字"nand"对要比较的字符数设置了限制,因此使用strncmp而不是 strcmp 没有多大意义。

的两个参数strcmp(或前两个参数strncmp)都是类型char*string已经是类型char*;假设它指向一个字符串(的第一个字符),只需将string,而不是*string,作为第一个参数传递给strcmp.

*binary = "000";甚至不应该编译。binary = "000";会编译,但它不会做你想做的事;这是一个指针赋值,它只影响binary你的函数本地的值;一旦函数返回,就没有明显的效果。

您可以将函数的第二个参数设为 a char**; 然后调用者可以执行以下操作:

char *binary;
if (opcodeBinary(some_string, &binary) {
    /* binary now points to a string like "000" */
}

或者调用者可以为字符串分配空间:

char binary[5]; /* or whatever size you need */

然后在您的函数中,通过调用替换分配strcpy

strcpy(binary, "000");

不能从函数返回数组;有几种方法可以间接完成同一件事,但它们都有些乏味。

于 2013-09-19T18:22:30.577 回答
1

您的函数opCodeBinary不进行类型检查。赋值*binary="000"时,左侧是类型的左值,char右侧是 a char*。的第一个操作数也是如此strncmp*在 C 中使用字符串时,不应在前面加上 a 。

我假设您需要做的是生成与汇编命令相对应的二进制操作码。您应该从中读取命令string并将操作码写入binary. 您在这里做错了几件事:

  1. 您无法移动指针stringbinary,因为您使用输入中的字符并为输出生成新的二进制操作码。opCodeBinary如果您要重复调用该函数,这将很有用。我建议您对两个参数都使用双指针opCodeBinary

  2. 我假设您不应该产生000ASCII 表示形式的操作码(即 string "000"),而是一个包含二进制形式的字节(或者,更糟糕的是,只有三位)。

我会为您的opCodeBinary功能建议以下内容。它正确地解析了上面的 (1) 和 (2),但它假定每个操作码都转到二进制文件中的一个或多个(完整)字节。

int opCodeBinary (char **string, char **binary)
{
  if (strncmp(*string, "add", 3) == 0) {
     *string += 3;
     *(*binary)++ = '\x00';
     return 1;
  }
  ...
}
于 2013-09-19T18:21:19.237 回答
0

使用错误的 strcnmp:传递字符(取消引用的 char 指针)而不是 char 指针(字符串),您需要传递要比较的字符数,作为第三个参数。

建议:使用哈希,将关键字映射到二进制代码

于 2013-09-19T20:48:58.423 回答