📄 inasm386.c
字号:
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 + -