⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 inasm386.c

📁 CC386 is a general-purpose 32-bit C compiler. It is not an optimizing compiler but given that the co
💻 C
📖 第 1 页 / 共 4 页
字号:
            case 4:
                if (ap2->length != 8)
                {
                    return (OCODE*) - 2;
                }
                break;
        }
    #endif 
    return make_ocode(ap1, ap2, 0);
}

//-------------------------------------------------------------------------

static OCODE *ope_bitscan(void)
{
    AMODE *ap1,  *ap2;
    ap1 = asm_amode(TRUE);
    if (!ap1)
        return 0;
    if (ap1->mode != am_dreg)
        return (OCODE*) - 1;
    needpunc(comma, 0);
    ap2 = asm_amode(TRUE);
    if (!ap2)
        return 0;
    if (!isrm(ap2, TRUE))
        return (OCODE*) - 1;
    if (ap1->length == 1 || ap2->length != ap1->length)
        return (OCODE*) - 2;
    return make_ocode(ap1, ap2, 0);

}

//-------------------------------------------------------------------------

static OCODE *ope_bit(void)
{
    AMODE *ap1,  *ap2;
    ap1 = asm_amode(TRUE);
    if (!ap1)
        return 0;
    if (!isrm(ap1, TRUE))
        return (OCODE*) - 1;
    needpunc(comma, 0);
    ap2 = asm_amode(TRUE);
    if (!ap2)
        return 0;
    if (ap2->mode != am_immed && ap2->mode != am_dreg)
        return (OCODE*) - 1;
    if (ap1->length == 1 || ap2->mode == am_dreg && ap2->length == 1)
        return (OCODE*) - 2;
    return make_ocode(ap1, ap2, 0);
}

//-------------------------------------------------------------------------

static OCODE *ope_call(void)
{
    AMODE *ap1 = asm_amode(TRUE),  *ap2;
    if (!ap1)
        return 0;
    if (ap1->mode == am_immed)
    {
        if (ap1->mode == am_immed && lastst == colon)
        {
            getsym();
            if (prm_asmfile && !prm_nasm)
                return (OCODE*) - 1;
            ap2 = asm_amode(TRUE);
            if (!ap2)
                return (OCODE*) - 1;
            if (ap2->mode != am_immed)
                return (OCODE*) - 1;
            ap1->length = ap2->length = 4;
            return make_ocode(ap1, ap2, 0);
        }
        else if (ap1->offset->nodetype != en_nalabcon && ap1->offset->nodetype
            != en_labcon && ap1->offset->nodetype != en_napccon || ap1->seg)
            return (OCODE*) - 1;
    }
    else
    {
        if (!isrm(ap1, TRUE))
            return (OCODE*) - 1;
        if (ap1->length && (ap1->length != 4) && (ap1->length != 7))
            return (OCODE*) - 2;
    }
    if ((ap1->mode == am_direct || ap1->mode == am_immed) && ap1->offset
        ->nodetype == en_labcon)
        ap1->length = 0;
    return make_ocode(ap1, 0, 0);
}

//-------------------------------------------------------------------------

static OCODE *ope_incdec(void)
{
    AMODE *ap1 = asm_amode(TRUE);
    if (!ap1)
        return 0;
    if (!isrm(ap1, TRUE))
        return (OCODE*) - 1;
    if (ap1->length > 4)
    {
        return (OCODE*) - 2;
    }
    return make_ocode(ap1, 0, 0);
}

//-------------------------------------------------------------------------

static OCODE *ope_rm(void)
{
    return (ope_incdec());
}

//-------------------------------------------------------------------------

static OCODE *ope_enter(void)
{
    AMODE *ap1,  *ap2;
    ap1 = asm_immed();
    if (!ap1)
        return 0;
    needpunc(comma, 0);
    ap2 = asm_immed();
    if (!ap2)
        return 0;
    return make_ocode(ap1, ap2, 0);
}

//-------------------------------------------------------------------------

static OCODE *ope_imul(void)
{
    AMODE *ap1 = asm_amode(TRUE),  *ap2 = 0,  *ap3 = 0;
    if (!ap1)
        return 0;
    if (!isrm(ap1, TRUE))
        return (OCODE*) - 1;
    if (lastst == comma)
    {
        getsym();
        ap2 = asm_amode(TRUE);
        if (lastst == comma)
        {
            getsym();
            ap3 = asm_amode(TRUE);
        }
    }
    if (ap2)
    {
        if (ap1->mode != am_dreg || ap1->length == 1)
            return (OCODE*) - 1;
        if (!isrm(ap2, TRUE) && ap2->mode != am_immed)
            return (OCODE*) - 1;
        if (ap3)
            if (ap2->mode == am_immed || ap3->mode != am_immed)
                return (OCODE*) - 1;
    }
    return make_ocode(ap1, ap2, ap3);
}

//-------------------------------------------------------------------------

static OCODE *ope_in(void)
{
    AMODE *ap1 = asm_amode(TRUE),  *ap2;
    if (!ap1)
        return 0;
    if (ap1->mode != am_dreg || ap1->preg != 0)
        return (OCODE*) - 1;
    needpunc(comma, 0);
    ap2 = asm_amode(TRUE);
    if (!ap2)
        return 0;
    if (ap2->mode != am_immed && (ap2->mode != am_dreg || ap2->preg != 2 || ap2
        ->length != 2))
        return (OCODE*) - 1;
    return make_ocode(ap1, ap2, 0);
}

//-------------------------------------------------------------------------

static OCODE *ope_imm8(void)
{
    AMODE *ap1 = asm_immed();
    if (!ap1)
        return 0;
    return make_ocode(ap1, 0, 0);
}

//-------------------------------------------------------------------------

static OCODE *ope_relbra(void)
{
    AMODE *ap1 = asm_amode(TRUE);
    if (!ap1)
        return 0;
    ap1->length = 0;
    if (ap1->mode != am_immed)
        return (OCODE*) - 1;
    if (ap1->offset->nodetype != en_nalabcon && ap1->offset->nodetype !=
        en_labcon)
        return (OCODE*) - 1;
    return make_ocode(ap1, 0, 0);
}

//-------------------------------------------------------------------------

static OCODE *ope_relbr8(void)
{
    return ope_relbra();
}

//-------------------------------------------------------------------------

static OCODE *ope_jmp(void)
{
    return ope_call();
}

//-------------------------------------------------------------------------

static OCODE *ope_regrm(void)
{
    AMODE *ap1,  *ap2;
    ap1 = asm_amode(TRUE);
    if (!ap1)
        return 0;
    if (ap1->mode != am_dreg)
        return (OCODE*) - 1;
    needpunc(comma, 0);
    ap2 = asm_amode(TRUE);
    if (!ap2)
        return 0;
    if (!isrm(ap2, TRUE))
        return (OCODE*) - 1;
    if (op == op_lea && ap2->mode == am_dreg)
        return (OCODE*) - 1;
    if (ap2->length && ap1->length != ap2->length || ap1->length == 1)
        return (OCODE*) - 2;
    return make_ocode(ap1, ap2, 0);
}

//-------------------------------------------------------------------------

static OCODE *ope_loadseg(void)
{
    AMODE *ap1,  *ap2;
    ap1 = asm_amode(TRUE);
    if (!ap1)
        return 0;
    if (ap1->mode != am_dreg)
        return (OCODE*) - 1;
    needpunc(comma, 0);
    ap2 = asm_amode(TRUE);
    if (!ap2)
        return 0;
    if (!isrm(ap2, TRUE))
        return (OCODE*) - 1;
    if (ap1->length != 4 || ap2->length != 7)
        return (OCODE*) - 1;
    ap2->length = 0;
    return make_ocode(ap1, ap2, 0);
}

//-------------------------------------------------------------------------

static OCODE *ope_lgdt(void)
{
    AMODE *ap1,  *ap2;
    ap1 = asm_amode(TRUE);
    if (!ap1)
        return 0;
    if (!isrm(ap1, FALSE) || ap1->length != 7)
        return (OCODE*) - 1;
    ap1->length = 0;
    return make_ocode(ap1, 0, 0);
}

//-------------------------------------------------------------------------

static OCODE *ope_lidt(void)
{
    return ope_lgdt();
}

//-------------------------------------------------------------------------

static OCODE *ope_rm16(void)
{
    AMODE *ap1,  *ap2;
    ap1 = asm_amode(TRUE);
    if (!ap1)
        return 0;
    if (!isrm(ap1, TRUE) || ap1->length != 2)
        return (OCODE*) - 1;
    return make_ocode(ap1, 0, 0);
}

//-------------------------------------------------------------------------

static OCODE *ope_mov(void)
{
    AMODE *ap1 = asm_amode(TRUE),  *ap2;
    if (!ap1)
        return 0;
    if (!isrm(ap1, TRUE) && ap1->mode != am_seg && ap1->mode != am_screg && ap1
        ->mode != am_sdreg && ap1->mode != am_streg)
        return (OCODE*) - 1;
    needpunc(comma, 0);
    ap2 = asm_amode(TRUE);
    if (!ap2)
        return 0;
    if (ap1->mode == am_dreg)
    {
        if (!isrm(ap2, TRUE) && ap2->mode != am_immed && ap2->mode != am_seg &&
            (ap2->length != 4 || (ap2->mode != am_screg && ap2->mode !=
            am_sdreg && ap2->mode != am_streg)))
            return (OCODE*) - 1;
    }
    else if (isrm(ap1, TRUE))
    {
        if (ap2->mode != am_dreg && ap2->mode != am_immed && ap2->mode !=
            am_seg)
            return (OCODE*) - 1;
    }
    else if (ap1->mode == am_seg)
    {
        if (!isrm(ap2, TRUE))
            return (OCODE*) - 1;
    }
    else if (ap2->length != 4 || ap2->mode != am_dreg)
        return (OCODE*) - 1;
    if (ap1->length && ap2->length && ap1->length != ap2->length)
        return (OCODE*) - 2;
    return make_ocode(ap1, ap2, 0);
}

//-------------------------------------------------------------------------

static OCODE *ope_movsx(void)
{
    AMODE *ap1,  *ap2;
    ap1 = asm_amode(TRUE);
    if (!ap1)
        return 0;
    if (ap1->mode != am_dreg)
        return (OCODE*) - 1;
    needpunc(comma, 0);
    ap2 = asm_amode(TRUE);
    if (!ap2)
        return 0;
    if (!isrm(ap2, TRUE))
        return (OCODE*) - 1;
    if (!ap2->length || ap1->length <= ap2->length)
    {
        asm_err(ERR_AINVSIZE);
    }
    return make_ocode(ap1, ap2, 0);
}

//-------------------------------------------------------------------------

static OCODE *ope_out(void)
{
    AMODE *ap1 = asm_amode(TRUE),  *ap2;
    if (!ap1)
        return 0;
    if (ap1->mode != am_immed && (ap1->mode != am_dreg || ap1->preg != 2 || ap1
        ->length != 2))
        return (OCODE*) - 1;
    needpunc(comma, 0);
    ap2 = asm_amode(TRUE);
    if (!ap2)
        return 0;
    if (ap2->mode != am_dreg || ap2->preg != 0)
        return (OCODE*) - 1;
    return make_ocode(ap1, ap2, 0);
}

//-------------------------------------------------------------------------

static OCODE *ope_pushpop(void)
{
    AMODE *ap1;
    ap1 = asm_amode(TRUE);
    if (!ap1)
        return 0;
    if (!isrm(ap1, TRUE) && ap1->mode != am_seg && (ap1->mode != am_immed || 
        (ap1->mode == am_immed && op == op_pop)))
        return (OCODE*) - 1;
    if (ap1->mode != am_immed && ap1->length != 2 && ap1->length != 4)
    {
        return (OCODE*) - 2;
    }
    if (op == op_pop && ap1->mode == am_seg && ap1->seg == 1)
        return (OCODE*) - 1;
    return make_ocode(ap1, 0, 0);
}

//-------------------------------------------------------------------------

static OCODE *ope_shift(void)
{
    AMODE *ap1,  *ap2;
    ap1 = asm_amode(2);
    if (!ap1)
        return 0;
    if (!isrm(ap1, TRUE))
        return (OCODE*) - 1;
    needpunc(comma, 0);
    ap2 = asm_amode(TRUE);
    if (!ap2)
        return 0;
    if (ap2->mode != am_immed && ap2->mode != am_dreg)
        return (OCODE*) - 1;
    if (ap2->mode == am_dreg)
        if (ap2->preg != 1 || ap2->length != 1)
            return (OCODE*) - 1;
    return make_ocode(ap1, ap2, 0);
}

//-------------------------------------------------------------------------

static OCODE *ope_ret(void)
{
    AMODE *ap1;
    if (lastst != iconst)
        return make_ocode(0, 0, 0);
    ap1 = asm_amode(TRUE);
    return make_ocode(ap1, 0, 0);
}

//-------------------------------------------------------------------------

static OCODE *ope_set(void)
{
    AMODE *ap1;
    ap1 = asm_amode(TRUE);
    if (!ap1)
        return 0;
    if (!isrm(ap1, TRUE) || ap1->length != 1)
        return (OCODE*) - 1;
    return make_ocode(ap1, 0, 0);
}

//-------------------------------------------------------------------------

static OCODE *ope_shld(void)
{
    AMODE *ap1,  *ap2,  *ap3;
    ap1 = asm_amode(TRUE);
    if (!ap1)
        return 0;
    if (!isrm(ap1, TRUE))
        return (OCODE*) - 1;
    needpunc(comma, 0);
    ap2 = asm_amode(TRUE);
    if (!ap2)
        return 0;
    if (ap2->mode != am_dreg || ap2->length == 1)
        return (OCODE*) - 1;
    if (ap1->length && ap1->length != ap2->length)
    {
        asm_err(ERR_AINVSIZE);
    }
    needpunc(comma, 0);
    ap3 = asm_amode(TRUE);
    if (!ap3)
        return 0;
    if (ap3->mode != am_immed && ap3->mode != am_dreg)
        return (OCODE*) - 1;
    if (ap3->mode == am_dreg)
        if (ap3->preg != 1 || ap3->length != 1)
            return (OCODE*) - 1;
    return make_ocode(ap1, ap2, ap3);
}

//-------------------------------------------------------------------------

static OCODE *ope_test(void)
{
    AMODE *ap1,  *ap2;
    ap1 = asm_amode(TRUE);
    if (!ap1)
        return 0;
    if (!isrm(ap1, TRUE))
        return (OCODE*) - 1;
    needpunc(comma, 0);
    ap2 = asm_amode(TRUE);
    if (!ap2)
        return 0;
    if (ap1->mode != am_dreg)
        if (ap2->mode != am_dreg && ap2->mode != am_immed)
            return (OCODE*) - 1;
    if (ap2->mode == am_dreg && ap1->length && ap1->length != ap2->length)
    {
        return (OCODE*) - 2;
    }
    return make_ocode(ap1, ap2, 0);
}

//-------------------------------------------------------------------------

static OCODE *ope_xchg(void)
{
    AMODE *ap1,  *ap2;
    ap1 = asm_amode(TRUE);
    if (!ap1)
        return 0;
    if (!isrm(ap1, TRUE))
        return (OCODE*) - 1;
    needpunc(comma, 0);
    ap2 = asm_amode(TRUE);
    if (!ap2)
        return 0;
    if (ap1->mode == am_dreg)
    {
        if (!isrm(ap2, TRUE))
            return (OCODE*) - 1;
    }
    else
        if (ap2->mode != am_dreg)
            return (OCODE*) - 1;
    if (ap1->length && ap2->length && ap1->length != ap2->length)
        return (OCODE*) - 2;
    return make_ocode(ap1, ap2, 0);
}

//-------------------------------------------------------------------------

static OCODE *ope_fmath(void)
{
    AMODE *ap1,  *ap2 = 0;
    ap1 = asm_amode(TRUE);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -