Пример #1
0
uint32_t ass_multiply(char *instruction) {

    char *mnemonic = get_mnemonic(instruction);
    char *rest = get_rest(instruction);

    char Rd[2], Rm[2], Rs[2], Rn[2];
    uint32_t RdI, RmI, RsI, RnI;

    uint32_t result = (111 << 29) | (1 << 4) | (1 << 7);

    if (strcmp(mnemonic,"mul") == 0) {
        sscanf(rest, "%[^','],%[^','],%s", Rd, Rm, Rs);
        RnI = 0;
    } else {
        sscanf(rest, "%[^','], %[^','], %[^','],%s", Rd, Rm, Rs, Rn);
        result |= (1 << 21);
        RnI = reg_from_string(Rn);
    }

    RdI = reg_from_string(Rd);
    RmI = reg_from_string(Rm);
    RsI = reg_from_string(Rs);

    result |= (RdI << 16) | (RnI << 12) | (RsI << 8) | (RmI & mask4);

    free(mnemonic);
    free(rest);

    return result;
}
Пример #2
0
int preprocess_get_line ( char read_in_line [], char label [] , char instruction [] ){

	/************************************************
		process lines
	************************************************/
	int a = 0;
	int * check_mark = &a;

	// printf("00#%s#", read_in_line);

	// 1. remove comment, semicolom, and empty line
	read_in_line = get_line_before_semicol(read_in_line, check_mark);
	// printf("label#%s#  instruction#%s#\n", label, instruction);
	// printf("1 #%s#\n\n", read_in_line);

	// 2. detect label 
	read_in_line = get_label_instruction(read_in_line, label);
	// printf("label#%s#  instruction#%s#\n", label, instruction);
	// printf("2 #%s#\n\n", read_in_line);

	// 3. find mnemonic
	read_in_line = get_mnemonic(read_in_line, instruction);
	// printf("label#%s#  instruction#%s#\n", label, instruction);
	// printf("3 #%s#\n\n", read_in_line);

	// 4. find quotation
	read_in_line = get_quotation(read_in_line, instruction);
	// printf("label#%s#  instruction#%s#\n", label, instruction);
	// printf("4 #%s#\n\n", read_in_line);

	// 5. put rest segments together, one comma is also a segment
	read_in_line = get_operations(read_in_line, instruction);
	// printf("label#%s#  instruction#%s#\n", label, instruction);

	print_output_line(label, instruction);

	return * check_mark;
}