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