C 开关忽略预定义的大小写并跳到默认大小写

C 开关忽略预定义的大小写并跳到默认大小写,c,switch-statement,mingw,C,Switch Statement,Mingw,首先,我想简单地解释一下我在做什么。我正在制作一个反汇编程序,但问题出在前缀识别器例程中。以下函数接收一个字节并将其与前缀表进行比较。它必须根据前缀显示字符串。例如,CS覆盖字节显示“CS” 但是有个问题。除了LOCK、REP和REPNE之外,它几乎可以处理所有前缀。当您向函数输入它们的值时,它会显示“unde”(如果该值在switch语句中没有条目,则为默认情况) 但是编译器是错误的:我有三个前缀(LOCK、REP和REPNE)的例子。我不明白为什么默认情况下忽略预定义情况。我在网上查过了,但

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

但是有个问题。除了LOCK、REP和REPNE之外,它几乎可以处理所有前缀。当您向函数输入它们的值时,它会显示“unde”(如果该值在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;
}
#包括
///前缀锁定并重复(第一组)
#定义前缀_锁0xF0
#定义前缀_repne 0xF2
#定义前缀_rep 0xF3
///前缀segmet覆盖(第二组)
#定义前缀\u cs\u覆盖0x2E
#定义前缀_ss_覆盖0x36
#定义前缀\u ds\u覆盖0x3E
#定义前缀_es_覆盖0x26
#定义前缀\u fs\u覆盖0x64
#定义前缀\u gs\u覆盖0x65
///这里有分支提示。
///操作数大小重写(第三组)
#定义前缀\操作数\大小\覆盖0x66
///地址大小覆盖(第四组)
#定义前缀\地址\大小\覆盖0x67
int show_prefixe(文件*我的_输出,字符前缀){
开关(前缀){
案例前缀\u锁:
fprintf(我的_输出,“锁定”);
打破
案例前缀报告:
fprintf(我的输出,“REPNE”);
打破
案例前缀_代表:
fprintf(我的输出,“REP”);
打破
大小写前缀\u ss\u覆盖:
fprintf(我的输出,“SS”);
打破
案例前缀\u cs\u覆盖:
fprintf(我的输出,“CS”);
打破
大小写前缀\u ds\u覆盖:
fprintf(我的输出,“DS”);
打破
案例前缀_es_覆盖:
fprintf(我的输出,“ES”);
打破
大小写前缀\u fs\u覆盖:
fprintf(我的输出,“FS”);
打破
案例前缀\u gs\u覆盖:
fprintf(我的输出,“GS”);
打破
大小写前缀\操作数\大小\覆盖:
fprintf(我的输出,“OP”);
打破
案例前缀\地址\大小\覆盖:
fprintf(我的输出,“地址”);
打破
违约:
fprintf(我的输出,“未定义”);
打破
}
}
int main()
{
文件*输出;
输出=fopen(“C:\\prefix.asm”,“wb”);
显示前缀(输出,前缀表示);
fclose(输出);
返回0;
}
编译器错了吗?它会有虫子吗?我在代码块中使用MinGW。
感谢您的帮助

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

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

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

请构造一个最小的测试用例。正如Oliver所说。其目的是找出错误的地方,在gcc中发现这样一个基本错误几乎是不可想象的。此外,以最大警告级别编译。我认为问题在于有符号字符和无符号字符之间。如果您将无符号字符作为前缀,它应该可以工作。“test.c:29:9:警告:大小写标签值超过类型[enabled by default]的最大值”(使用gcc 4.8.2)如果我使用的有符号整数的值超出其最大范围,可能会发生同样的问题??这只是一种好奇