diff --git a/src/arch/i386.ins b/src/arch/i386.ins index 09a93c1..2cbe868 100644 --- a/src/arch/i386.ins +++ b/src/arch/i386.ins @@ -51,6 +51,12 @@ #define OP_RW AO_REGISTER(0, W, 0) #define OP_al AO_REGISTER(AOF_IMPLICIT, REG_al_size, REG_al_id) #define OP_cl AO_REGISTER(AOF_IMPLICIT, REG_cl_size, REG_cl_id) +#define OP_cs AO_REGISTER(AOF_IMPLICIT, REG_cs_size, REG_cs_id) +#define OP_ds AO_REGISTER(AOF_IMPLICIT, REG_ds_size, REG_ds_id) +#define OP_es AO_REGISTER(AOF_IMPLICIT, REG_es_size, REG_es_id) +#define OP_fs AO_REGISTER(AOF_IMPLICIT, REG_fs_size, REG_fs_id) +#define OP_gs AO_REGISTER(AOF_IMPLICIT, REG_gs_size, REG_gs_id) +#define OP_ss AO_REGISTER(AOF_IMPLICIT, REG_ss_size, REG_ss_id) #define OP_AX AO_REGISTER(AOF_IMPLICIT, W, REG_AX_id) #define OP_CX AO_REGISTER(AOF_IMPLICIT, W, REG_CX_id) #define OP_DX AO_REGISTER(AOF_IMPLICIT, W, REG_DX_id) @@ -419,6 +425,44 @@ { "fwait", 0x9b, OP1F, AOT_NONE, AOT_NONE, AOT_NONE }, /* NOP 0x90 1 */ { "nop", 0x90, OP1F, AOT_NONE, AOT_NONE, AOT_NONE }, +/* PUSH 0x06 1 es */ +{ "push", 0x06, OP1F, OP_es, AOT_NONE, AOT_NONE }, +/* PUSH 0x0e 1 cs */ +{ "push", 0x0e, OP1F, OP_cs, AOT_NONE, AOT_NONE }, +/* PUSH 0x16 1 ss */ +{ "push", 0x16, OP1F, OP_ss, AOT_NONE, AOT_NONE }, +/* PUSH 0x1e 1 ds */ +{ "push", 0x1e, OP1F, OP_ds, AOT_NONE, AOT_NONE }, +/* PUSH 0x0fa0 2 fs */ +{ "push", 0x0fa0, OP2F, OP_fs, AOT_NONE, AOT_NONE }, +/* PUSH 0x0fa8 2 gs */ +{ "push", 0x0fa8, OP2F, OP_gs, AOT_NONE, AOT_NONE }, +/* PUSH 0x50 +rW 1 */ +{ "push", 0x50, OP1F, OP_AX, AOT_NONE, AOT_NONE }, +{ "push", 0x51, OP1F, OP_CX, AOT_NONE, AOT_NONE }, +{ "push", 0x52, OP1F, OP_DX, AOT_NONE, AOT_NONE }, +{ "push", 0x53, OP1F, OP_BX, AOT_NONE, AOT_NONE }, +{ "push", 0x54, OP1F, OP_SP, AOT_NONE, AOT_NONE }, +{ "push", 0x55, OP1F, OP_BP, AOT_NONE, AOT_NONE }, +{ "push", 0x56, OP1F, OP_SI, AOT_NONE, AOT_NONE }, +{ "push", 0x57, OP1F, OP_DI, AOT_NONE, AOT_NONE }, +/* PUSH 0x6a 1 imm8 */ +{ "push", 0x6a, OP1F, OP_S8, AOT_NONE, AOT_NONE }, +/* PUSH 0x68 1 immW */ +{ "push", 0x68, OP1F, OP_SW, AOT_NONE, AOT_NONE }, +/* PUSH 0xff /6 1 rmW */ +{ "push", 0xff, OP1F, OP_RMW_D0+6,AOT_NONE, AOT_NONE }, +{ "push", 0xff, OP1F, OP_RMW_D8+6,AOT_NONE, AOT_NONE }, +{ "push", 0xff, OP1F, OP_RMW_DW+6,AOT_NONE, AOT_NONE }, +{ "push", 0xff, OP1F, OP_RMW_RW+6,AOT_NONE, AOT_NONE }, +/* PUSHA 0x60 1 */ +{ "pusha", 0x60, OP1F, AOT_NONE, AOT_NONE, AOT_NONE }, +/* PUSHAD 0x60 1 */ +{ "pushad", 0x60, OP1F, AOT_NONE, AOT_NONE, AOT_NONE }, +/* PUSHF 0x9c 1 */ +{ "pushf", 0x9c, OP1F, AOT_NONE, AOT_NONE, AOT_NONE }, +/* PUSHFD 0x9c 1 */ +{ "pushfd", 0x9c, OP1F, AOT_NONE, AOT_NONE, AOT_NONE }, /* RCL */ /* FIXME implement */ /* RCR */ diff --git a/test/i386.S b/test/i386.S index 47c8519..e69b5a0 100644 --- a/test/i386.S +++ b/test/i386.S @@ -145,6 +145,29 @@ fnclex fwait nop /* 90 */ + push %cs /* 0e */ + push %ss /* 16 */ + push %ds /* 1e */ + push %es /* 06 */ + push %fs /* 0f a0 */ + push %gs /* 0f a8 */ + push %eax + push %ecx + push %edx + push %ebx + push %esp + push %ebp + push %esi + push %edi + push $0x42 + push $0x42424242 + push [%eax] + push [%eax + $0x42] + push [%eax + $0x43424140] + pusha /* 60 */ + pushad /* 60 */ + pushf /* 9c */ + pushfd /* 9c */ ret ret $0x3412 rsm /* 0f aa */