UVa 448 - OOPS!

题目:做一个反汇编器,将16进制码转化成汇编指令。

分析:模拟。输入都是合法的按顺序解析即可。

            这里有两个问题:

            1.指令的格式为:命令+参数(不同指令参数不同,但不变);

            2.指令可能分布在相邻的两行,如果发现余下长度不够,则劈接到下一次开头;

说明:(⊙v⊙),发现排名提升了(新的排名算法?)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char cmd_list[16][5] = {
	"ADD", "SUB", "MUL", "DIV", "MOV",
	"BREQ", "BRLE", "BRLS", "BRGE", "BRGR", "BRNE", "BR",
	"AND", "OR", "XOR", "NOT",
};

int par_list[16] = {
	2, 2, 2, 2, 2,
	1, 1, 1, 1, 1, 1, 1,
	3, 3, 3, 1,
};

int char_to_hex(char c)
{
	if (c >= '0' && c <= '9') {
		return c-'0';
	}else {
		return c-'A'+10;
	}
}

char mod_list[4][4] = {"R", "$", "PC+", ""};
void par_print(char str[], int now)
{
	int mode  = char_to_hex(str[now])>>2;
	int value = char_to_hex(str[now])-(mode<<2);
	for (int i = 1; i < 4; ++ i) {
		value = value*16 + char_to_hex(str[now+i]);
	}
	printf("%s%d",mod_list[mode],value);
}

int disassembly(char str[], int end)
{
	int move = 0;
	while (str[move]) {
		int index = char_to_hex(str[move]);
		// half hex command 
		if (move+1+par_list[index]*4 > end) {
			return move;
		}
		printf("%s ",cmd_list[index]);
		move ++;
		for (int i = 0; i < par_list[index]; ++ i) {
			if (i) {
				printf(",");
			}
			par_print(str, move);
			move += 4;
		}
		printf("\n");
	}
	return move;
}

int main()
{
	char buf[100], ass[100];
	int  save = 0;
	while (~scanf("%s",&buf[save])) {
		int end = strlen(buf);
		strcpy(ass, buf);
		int left = disassembly(ass, end);
		save = 0;
		while (left < end) {
			buf[save ++] = ass[left ++]; 
		}
	}
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值