首先,我想简要解释一下我在做什么。我正在制作反汇编程序,但问题出在前缀识别器例程中。以下函数接收一个字节并将其与前缀表进行比较。它必须根据前缀显示一个字符串。例如,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。 谢谢你的帮助
答案 0 :(得分:2)
尝试将unsigned char传递给您的函数。问题应该是0xF3例如是243并且您使用的是(签名的)char,它不能支持这样的值。
int show_prefixe(FILE *my_output, unsigned char prefix) { ...
此外,你的函数应该返回一些东西,所以假设你在switch语句的末尾返回0。