Example #1
0
struct process_parameter_results process_parameter(struct ast_node_parameter* param)
{
    struct process_parameter_results result;
    result.v = 0x0;
    result.v_extra = 0x0;
    result.v_extra_used = false;
    result.v_label = NULL;
    result.v_label_bracketed = false;
    result.v_raw = NULL;
    printd(LEVEL_VERBOSE, " ");

    switch (param->type)
    {
        case type_address:
            return process_address(param->address);

        case type_register:
            return process_register(param->registr);

        case type_raw:
            result.v_raw = param->raw;
            break;

        default:
            assert(false);
    }

    return result;
}
Example #2
0
struct process_parameter_results process_parameter(struct ast_node_parameter* param)
{
	struct process_parameter_results result;
	result.v = 0x0;
	result.v_extra = 0x0;
	result.v_extra_used = false;
	result.v_label = NULL;
	result.v_label_bracketed = false;
	result.v_raw = NULL;
	fprintf(stderr, " ");

	switch (param->type)
	{
		case type_address:
			return process_address(param->address);

		case type_register:
			return process_register(param->registr);

		case type_raw:
			result.v_raw = param->raw;
	}

	return result;
}
Example #3
0
struct process_parameter_results process_address(struct ast_node_address* param)
{
    struct process_parameter_results result;
    struct register_mapping* registr;
    bstring btmp = NULL;
    result.v_raw = NULL;

    if (param->value != NULL)
        btmp = expr_representation(param->value);

    if (param->bracketed && param->added)
    {
        // This is of the form [0x1000+I].
        registr = get_register_by_name_next(param->addcmpt);

        if (registr == NULL)
        {
            // Attempt to use a label in square brackets.  Convert this
            // to an expression and then reinvoke ourselves with the
            // evaluated value.
            param->value = expr_new(expr_new_label(bautofree(bfromcstr(param->addcmpt))), EXPR_OP_ADD, param->value);
            param->addcmpt = "";
            param->added = 0;
            param->bracketed = 0;

            bdestroy(btmp);
            return process_address(param);
        }
        else if (registr->value == VALUE_NEXT_UNSUPPORTED)
        {
            // Attempt to use a register in brackets that can't be.
            printd(LEVEL_VERBOSE, "\n");
            dhalt(ERR_NEXTED_REGISTER_UNSUPPORTED, param->addcmpt);
        }

        printd(LEVEL_VERBOSE, "[%s+%s]", btmp->data, registr->name);
        result.v = registr->value;
        result.v_extra = param->value;
        result.v_extra_used = true;
        result.v_label = NULL;
    }
    else
    {
        // This is either the form 0x1000 or [0x1000].
        if (param->bracketed)
        {
            printd(LEVEL_VERBOSE, "[%s]", btmp->data);
            result.v = NXT;
        }
        else
        {
            printd(LEVEL_VERBOSE, "%s", btmp->data);
            result.v = NXT_LIT;
        }

        result.v_extra = param->value;
        result.v_extra_used = true;
        result.v_label = NULL;
    }

    if (btmp != NULL)
        bdestroy(btmp);

    return result;
}