From: Robert Pengelly Date: Sat, 31 Jan 2026 19:01:52 +0000 (+0000) Subject: More 64-bit support X-Git-Url: https://git.candlhat.org/?a=commitdiff_plain;h=2279afd3ea29b56eb0c73159ffbd4091c7822180;p=sasm.git More 64-bit support --- diff --git a/intel.c b/intel.c index 19274d5..2ddc702 100644 --- a/intel.c +++ b/intel.c @@ -334,6 +334,7 @@ static struct template template_table[] = { { "mov", 0x0F21, NONE, 2, { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 }, { 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0 }, { { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1 } } }, { "mov", 0x0F21, NONE, 2, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, { 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0 }, { { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1 } } }, { "mov", 0x0F24, NONE, 2, { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 }, { 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0 }, { { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1 } } }, + { "mov", 0xB8, NONE, 2, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0 }, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 } } }, /* 64-bit only moves. */ { "movabs", 0xA0, NONE, 2, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, { 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0 }, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0 } } }, @@ -1541,6 +1542,10 @@ static struct model_entry *find_model_entry (char *name) { #define EXPR_TYPE_DWORD_PTR EXPR_TYPE_MACHINE_DEPENDENT_7 #define EXPR_TYPE_FWORD_PTR EXPR_TYPE_MACHINE_DEPENDENT_8 #define EXPR_TYPE_QWORD_PTR EXPR_TYPE_MACHINE_DEPENDENT_9 +#define EXPR_TYPE_TBYTE_PTR EXPR_TYPE_MACHINE_DEPENDENT_10 + +#define EXPR_TYPE_XMMWORD_PTR EXPR_TYPE_MACHINE_DEPENDENT_11 +#define EXPR_TYPE_OWORD_PTR EXPR_TYPE_MACHINE_DEPENDENT_12 struct modrm_byte { @@ -1979,7 +1984,7 @@ static void handler_extern (char *start, char **pp) { *pp = skip_whitespace (*pp); - if (xstrcasecmp (qualifier, "byte") && xstrcasecmp (qualifier, "word") && xstrcasecmp (qualifier, "dword")) { + if (xstrcasecmp (qualifier, "byte") && xstrcasecmp (qualifier, "word") && xstrcasecmp (qualifier, "dword") && xstrcasecmp (qualifier, "proc")) { free (qualifier); goto error; @@ -2095,6 +2100,14 @@ static void handler_option (char *start, char **pp) { } + if (xstrcasecmp (arg, "nokeyword") == 0 || xstrcasecmp (arg, "casemap") == 0) { + + free (arg); + + ignore_rest_of_line (pp); + return; + } + if (xstrcasecmp (arg, "segment") == 0) { caret = (*pp = skip_whitespace (*pp)); @@ -3198,6 +3211,21 @@ static int intel_parse_operand (char *start, char *operand_string) { break; + case EXPR_TYPE_TBYTE_PTR: + + instruction.types[instruction.operands].tbyte = 1; + + if (intel_float_suffix_translation (current_templates->name) == 1) { + suffix = INTEL_SUFFIX; + } + + break; + + case EXPR_TYPE_OWORD_PTR: case EXPR_TYPE_XMMWORD_PTR: + + instruction.types[instruction.operands].xmmword = 1; + break; + default: break; @@ -3740,6 +3768,9 @@ static int intel_simplify_expr (struct expr *expr) { case EXPR_TYPE_DWORD_PTR: case EXPR_TYPE_FWORD_PTR: case EXPR_TYPE_QWORD_PTR: + case EXPR_TYPE_TBYTE_PTR: + case EXPR_TYPE_XMMWORD_PTR: + case EXPR_TYPE_OWORD_PTR: case EXPR_TYPE_NEAR_PTR: case EXPR_TYPE_FAR_PTR: @@ -3887,6 +3918,9 @@ static const struct intel_type intel_types[] = { INTEL_TYPE (DWORD, 4), INTEL_TYPE (FWORD, 6), INTEL_TYPE (QWORD, 8), + INTEL_TYPE (TBYTE, 8), + INTEL_TYPE (XMMWORD, 16), + INTEL_TYPE (OWORD, 16), { "near", EXPR_TYPE_NEAR_PTR, { 0xFF02, 0xFF04 } }, { "far", EXPR_TYPE_FAR_PTR, { 0xFF05, 0xFF06 } }, diff --git a/kwd.c b/kwd.c index 55fd366..4303d4e 100644 --- a/kwd.c +++ b/kwd.c @@ -578,6 +578,10 @@ static void handler_word (char *start, char **pp) { handle_constant (start, pp, 2); } +static void handler_qword (char *start, char **pp) { + handle_constant (start, pp, 8); +} + static struct pseudo_op_entry pseudo_op_table[] = { { ".code", &handler_text }, @@ -601,6 +605,7 @@ static struct pseudo_op_entry data_pseudo_op_table[] = { { "db", &handler_byte }, { "dd", &handler_long }, { "dw", &handler_word }, + { "dq", &handler_qword }, { 0, 0 }