Switch忽略预定义的情况并跳转到默认情况

时间:2014-09-26 19:28:42

标签: c switch-statement mingw

首先,我想简要解释一下我在做什么。我正在制作反汇编程序,但问题出在前缀识别器例程中。以下函数接收一个字节并将其与前缀表进行比较。它必须根据前缀显示一个字符串。例如,CS覆盖字节显示'CS'。

但是有一个问题。几乎每个前缀都可以正常工作,除了LOCK,REP和REPNE。当您向函数输入它们的值时,它会显示“UNDEF”(如果该值在switch语句中没有条目,则为默认情况)

但是编译器错了:我有三个前缀(LOCK,REP和REPNE)的情况。我无法理解为什么忽略预定义的情况需要默认情况。我在互联网上看了,但我找不到问题的答案。

#include <stdio.h>

///Prefixes lock and repeat (group one)

#define prefix_lock  0xF0
#define prefix_repne 0xF2
#define prefix_rep 0xF3

///Prefixes segmet override (group two)
#define prefix_cs_override      0x2E
#define prefix_ss_override      0x36
#define prefix_ds_override      0x3E
#define prefix_es_override      0x26
#define prefix_fs_override      0x64
#define prefix_gs_override      0x65

///Branch hints goes here.

///Operand-size override (group three)
#define prefix_operand_size_override    0x66

///Address-size override (group four)
#define prefix_address_size_override    0x67



int show_prefixe(FILE *my_output, char prefix){
    switch(prefix){
        case prefix_lock:
            fprintf(my_output, "LOCK ");
            break;
        case prefix_repne:
            fprintf(my_output, "REPNE ");
            break;
        case prefix_rep:
            fprintf(my_output, "REP ");
            break;
        case prefix_ss_override:
            fprintf(my_output, "SS ");
            break;
        case prefix_cs_override:
            fprintf(my_output, "CS ");
            break;
        case prefix_ds_override:
            fprintf(my_output, "DS ");
            break;
        case prefix_es_override:
            fprintf(my_output, "ES ");
            break;
        case prefix_fs_override:
            fprintf(my_output, "FS ");
            break;
        case prefix_gs_override:
            fprintf(my_output, "GS ");
            break;
        case prefix_operand_size_override:
            fprintf(my_output, "OP ");
            break;
        case prefix_address_size_override:
            fprintf(my_output, "ADDR ");
            break;
        default:
            fprintf(my_output, "UNDEF ");
            break;
    }
}

int main()
{
    FILE *output;
    output = fopen("C:\\prefix.asm", "wb");
    show_prefixe(output, prefix_rep);
    fclose(output);
    return 0;
}

编译器错了吗?它有虫吗?我在Codeblocks中使用MinGW。 谢谢你的帮助

1 个答案:

答案 0 :(得分:2)

尝试将unsigned char传递给您的函数。问题应该是0xF3例如是243并且您使用的是(签名的)char,它不能支持这样的值。

int show_prefixe(FILE *my_output, unsigned char prefix) { ...

此外,你的函数应该返回一些东西,所以假设你在switch语句的末尾返回0。