1 /* assemble.c code generation for the Netwide Assembler
3 * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
4 * Julian Hall. All rights reserved. The software is
5 * redistributable under the license given in the file "LICENSE"
6 * distributed in the NASM archive.
8 * the actual codes (C syntax, i.e. octal):
9 * \0 - terminates the code. (Unless it's a literal of course.)
10 * \1, \2, \3 - that many literal bytes follow in the code stream
11 * \4, \6 - the POP/PUSH (respectively) codes for CS, DS, ES, SS
12 * (POP is never used for CS) depending on operand 0
13 * \5, \7 - the second byte of POP/PUSH codes for FS, GS, depending
15 * \10..\13 - a literal byte follows in the code stream, to be added
16 * to the register value of operand 0..3
17 * \14..\17 - a signed byte immediate operand, from operand 0..3
18 * \20..\23 - a byte immediate operand, from operand 0..3
19 * \24..\27 - an unsigned byte immediate operand, from operand 0..3
20 * \30..\33 - a word immediate operand, from operand 0..3
21 * \34..\37 - select between \3[0-3] and \4[0-3] depending on 16/32 bit
22 * assembly mode or the operand-size override on the operand
23 * \40..\43 - a long immediate operand, from operand 0..3
24 * \44..\47 - select between \3[0-3], \4[0-3] and \5[4-7]
25 * depending on the address size of the instruction.
26 * \50..\53 - a byte relative operand, from operand 0..3
27 * \54..\57 - a qword immediate operand, from operand 0..3
28 * \60..\63 - a word relative operand, from operand 0..3
29 * \64..\67 - select between \6[0-3] and \7[0-3] depending on 16/32 bit
30 * assembly mode or the operand-size override on the operand
31 * \70..\73 - a long relative operand, from operand 0..3
32 * \74..\77 - a word constant, from the _segment_ part of operand 0..3
33 * \1ab - a ModRM, calculated on EA in operand a, with the spare
34 * field the register value of operand b.
35 * \140..\143 - an immediate word or signed byte for operand 0..3
36 * \144..\147 - or 2 (s-field) into opcode byte if operand 0..3
37 * is a signed byte rather than a word. Opcode byte follows.
38 * \150..\153 - an immediate dword or signed byte for operand 0..3
39 * \154..\157 - or 2 (s-field) into opcode byte if operand 0..3
40 * is a signed byte rather than a dword. Opcode byte follows.
41 * \160..\163 - this instruction uses DREX rather than REX, with the
42 * OC0 field set to 0, and the dest field taken from
44 * \164..\167 - this instruction uses DREX rather than REX, with the
45 * OC0 field set to 1, and the dest field taken from
47 * \171 - placement of DREX suffix in the absence of an EA
48 * \172\ab - the register number from operand a in bits 7..4, with
49 * the 4-bit immediate from operand b in bits 3..0.
50 * \173\xab - the register number from operand a in bits 7..4, with
51 * the value b in bits 3..0.
52 * \174\a - the register number from operand a in bits 7..4, and
53 * an arbitrary value in bits 3..0 (assembled as zero.)
54 * \2ab - a ModRM, calculated on EA in operand a, with the spare
55 * field equal to digit b.
56 * \250..\253 - same as \150..\153, except warn if the 64-bit operand
57 * is not equal to the truncated and sign-extended 32-bit
58 * operand; used for 32-bit immediates in 64-bit mode.
59 * \260..\263 - this instruction uses VEX rather than REX, with the
60 * V field taken from operand 0..3.
61 * \270 - this instruction uses VEX rather than REX, with the
62 * V field set to 1111b.
64 * VEX prefixes are followed by the sequence:
65 * \mm\wlp where mm is the M field; and wlp is:
67 * [w0] ww = 0 for W = 0
68 * [w1] ww = 1 for W = 1
69 * [wx] ww = 2 for W don't care (always assembled as 0)
70 * [ww] ww = 3 for W used as REX.W
73 * \310 - indicates fixed 16-bit address size, i.e. optional 0x67.
74 * \311 - indicates fixed 32-bit address size, i.e. optional 0x67.
75 * \312 - (disassembler only) marker on LOOP, LOOPxx instructions.
76 * \313 - indicates fixed 64-bit address size, 0x67 invalid.
77 * \314 - (disassembler only) invalid with REX.B
78 * \315 - (disassembler only) invalid with REX.X
79 * \316 - (disassembler only) invalid with REX.R
80 * \317 - (disassembler only) invalid with REX.W
81 * \320 - indicates fixed 16-bit operand size, i.e. optional 0x66.
82 * \321 - indicates fixed 32-bit operand size, i.e. optional 0x66.
83 * \322 - indicates that this instruction is only valid when the
84 * operand size is the default (instruction to disassembler,
85 * generates no code in the assembler)
86 * \323 - indicates fixed 64-bit operand size, REX on extensions only.
87 * \324 - indicates 64-bit operand size requiring REX prefix.
88 * \330 - a literal byte follows in the code stream, to be added
89 * to the condition code value of the instruction.
90 * \331 - instruction not valid with REP prefix. Hint for
91 * disassembler only; for SSE instructions.
92 * \332 - REP prefix (0xF2 byte) used as opcode extension.
93 * \333 - REP prefix (0xF3 byte) used as opcode extension.
94 * \334 - LOCK prefix used instead of REX.R
95 * \335 - disassemble a rep (0xF3 byte) prefix as repe not rep.
96 * \340 - reserve <operand 0> bytes of uninitialized storage.
97 * Operand 0 had better be a segmentless constant.
98 * \360 - no SSE prefix (== \364\331)
99 * \361 - 66 SSE prefix (== \366\331)
100 * \362 - F2 SSE prefix (== \364\332)
101 * \363 - F3 SSE prefix (== \364\333)
102 * \364 - operand-size prefix (0x66) not permitted
103 * \365 - address-size prefix (0x67) not permitted
104 * \366 - operand-size prefix (0x66) used as opcode extension
105 * \367 - address-size prefix (0x67) used as opcode extension
106 * \370,\371,\372 - match only if operand 0 meets byte jump criteria.
107 * 370 is used for Jcc, 371 is used for JMP.
108 * \373 - assemble 0x03 if bits==16, 0x05 if bits==32;
109 * used for conditional jump over longer jump
112 #include "compiler.h"
116 #include <inttypes.h>
120 #include "assemble.h"
124 /* Initialized to zero by the C standard */
125 static const uint8_t const_zero_buf
[256];
128 int sib_present
; /* is a SIB byte necessary? */
129 int bytes
; /* # of bytes of offset needed */
130 int size
; /* lazy - this is sib+bytes+1 */
131 uint8_t modrm
, sib
, rex
, rip
; /* the bytes themselves */
134 static uint32_t cpu
; /* cpu level received from nasm.c */
135 static efunc errfunc
;
136 static struct ofmt
*outfmt
;
137 static ListGen
*list
;
139 static int64_t calcsize(int32_t, int64_t, int, insn
*, const uint8_t *);
140 static void gencode(int32_t, int64_t, int, insn
*, const uint8_t *, int64_t);
141 static int matches(const struct itemplate
*, insn
*, int bits
);
142 static int32_t regflag(const operand
*);
143 static int32_t regval(const operand
*);
144 static int rexflags(int, int32_t, int);
145 static int op_rexflags(const operand
*, int);
146 static ea
*process_ea(operand
*, ea
*, int, int, int, int32_t);
147 static void add_asp(insn
*, int);
149 static int has_prefix(insn
* ins
, enum prefix_pos pos
, enum prefixes prefix
)
151 return ins
->prefixes
[pos
] == prefix
;
154 static void assert_no_prefix(insn
* ins
, enum prefix_pos pos
)
156 if (ins
->prefixes
[pos
])
157 errfunc(ERR_NONFATAL
, "invalid %s prefix",
158 prefix_name(ins
->prefixes
[pos
]));
161 static const char *size_name(int size
)
183 static void warn_overflow(int size
, int64_t data
)
186 int64_t lim
= ((int64_t)1 << (size
*8))-1;
188 if (data
< ~lim
|| data
> lim
)
189 errfunc(ERR_WARNING
| ERR_WARN_NOV
,
190 "%s data exceeds bounds", size_name(size
));
194 * This routine wrappers the real output format's output routine,
195 * in order to pass a copy of the data off to the listing file
196 * generator at the same time.
198 static void out(int64_t offset
, int32_t segto
, const void *data
,
199 enum out_type type
, uint64_t size
,
200 int32_t segment
, int32_t wrt
)
202 static int32_t lineno
= 0; /* static!!! */
203 static char *lnfname
= NULL
;
206 if (type
== OUT_ADDRESS
&& segment
== NO_SEG
&& wrt
== NO_SEG
) {
208 * This is a non-relocated address, and we're going to
209 * convert it into RAWDATA format.
214 errfunc(ERR_PANIC
, "OUT_ADDRESS with size > 8");
218 WRITEADDR(q
, *(int64_t *)data
, size
);
223 list
->output(offset
, data
, type
, size
);
226 * this call to src_get determines when we call the
227 * debug-format-specific "linenum" function
228 * it updates lineno and lnfname to the current values
229 * returning 0 if "same as last time", -2 if lnfname
230 * changed, and the amount by which lineno changed,
231 * if it did. thus, these variables must be static
234 if (src_get(&lineno
, &lnfname
)) {
235 outfmt
->current_dfmt
->linenum(lnfname
, lineno
, segto
);
238 outfmt
->output(segto
, data
, type
, size
, segment
, wrt
);
241 static int jmp_match(int32_t segment
, int64_t offset
, int bits
,
242 insn
* ins
, const uint8_t *code
)
247 if (c
!= 0370 && c
!= 0371)
249 if (ins
->oprs
[0].opflags
& OPFLAG_FORWARD
) {
250 if ((optimizing
< 0 || (ins
->oprs
[0].type
& STRICT
))
254 return (pass0
== 0); /* match a forward reference */
256 isize
= calcsize(segment
, offset
, bits
, ins
, code
);
257 if (ins
->oprs
[0].segment
!= segment
)
259 isize
= ins
->oprs
[0].offset
- offset
- isize
; /* isize is now the delta */
260 if (isize
>= -128L && isize
<= 127L)
261 return 1; /* it is byte size */
266 int64_t assemble(int32_t segment
, int64_t offset
, int bits
, uint32_t cp
,
267 insn
* instruction
, struct ofmt
*output
, efunc error
,
270 const struct itemplate
*temp
;
275 int64_t start
= offset
;
276 int64_t wsize
= 0; /* size for DB etc. */
278 errfunc
= error
; /* to pass to other functions */
280 outfmt
= output
; /* likewise */
281 list
= listgen
; /* and again */
283 switch (instruction
->opcode
) {
313 int32_t t
= instruction
->times
;
316 "instruction->times < 0 (%ld) in assemble()", t
);
318 while (t
--) { /* repeat TIMES times */
319 for (e
= instruction
->eops
; e
; e
= e
->next
) {
320 if (e
->type
== EOT_DB_NUMBER
) {
322 if (e
->segment
!= NO_SEG
)
323 errfunc(ERR_NONFATAL
,
324 "one-byte relocation attempted");
326 uint8_t out_byte
= e
->offset
;
327 out(offset
, segment
, &out_byte
,
328 OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
330 } else if (wsize
> 8) {
331 errfunc(ERR_NONFATAL
,
332 "integer supplied to a DT, DO or DY"
335 out(offset
, segment
, &e
->offset
,
336 OUT_ADDRESS
, wsize
, e
->segment
, e
->wrt
);
338 } else if (e
->type
== EOT_DB_STRING
||
339 e
->type
== EOT_DB_STRING_FREE
) {
342 out(offset
, segment
, e
->stringval
,
343 OUT_RAWDATA
, e
->stringlen
, NO_SEG
, NO_SEG
);
344 align
= e
->stringlen
% wsize
;
347 align
= wsize
- align
;
348 out(offset
, segment
, const_zero_buf
,
349 OUT_RAWDATA
, align
, NO_SEG
, NO_SEG
);
351 offset
+= e
->stringlen
+ align
;
354 if (t
> 0 && t
== instruction
->times
- 1) {
356 * Dummy call to list->output to give the offset to the
359 list
->output(offset
, NULL
, OUT_RAWDATA
, 0);
360 list
->uplevel(LIST_TIMES
);
363 if (instruction
->times
> 1)
364 list
->downlevel(LIST_TIMES
);
365 return offset
- start
;
368 if (instruction
->opcode
== I_INCBIN
) {
369 const char *fname
= instruction
->eops
->stringval
;
372 fp
= fopen(fname
, "rb");
374 error(ERR_NONFATAL
, "`incbin': unable to open file `%s'",
376 } else if (fseek(fp
, 0L, SEEK_END
) < 0) {
377 error(ERR_NONFATAL
, "`incbin': unable to seek on file `%s'",
380 static char buf
[4096];
381 size_t t
= instruction
->times
;
386 if (instruction
->eops
->next
) {
387 base
= instruction
->eops
->next
->offset
;
389 if (instruction
->eops
->next
->next
&&
390 len
> (size_t)instruction
->eops
->next
->next
->offset
)
391 len
= (size_t)instruction
->eops
->next
->next
->offset
;
394 * Dummy call to list->output to give the offset to the
397 list
->output(offset
, NULL
, OUT_RAWDATA
, 0);
398 list
->uplevel(LIST_INCBIN
);
402 fseek(fp
, base
, SEEK_SET
);
406 fread(buf
, 1, (l
> (int32_t) sizeof(buf
) ? (int32_t) sizeof(buf
) : l
),
410 * This shouldn't happen unless the file
411 * actually changes while we are reading
415 "`incbin': unexpected EOF while"
416 " reading file `%s'", fname
);
417 t
= 0; /* Try to exit cleanly */
420 out(offset
, segment
, buf
, OUT_RAWDATA
, m
,
425 list
->downlevel(LIST_INCBIN
);
426 if (instruction
->times
> 1) {
428 * Dummy call to list->output to give the offset to the
431 list
->output(offset
, NULL
, OUT_RAWDATA
, 0);
432 list
->uplevel(LIST_TIMES
);
433 list
->downlevel(LIST_TIMES
);
436 return instruction
->times
* len
;
438 return 0; /* if we're here, there's an error */
441 /* Check to see if we need an address-size prefix */
442 add_asp(instruction
, bits
);
446 for (temp
= nasm_instructions
[instruction
->opcode
]; temp
->opcode
!= -1; temp
++){
447 int m
= matches(temp
, instruction
, bits
);
450 m
+= jmp_match(segment
, offset
, bits
, instruction
, temp
->code
);
452 if (m
== 100) { /* matches! */
453 const uint8_t *codes
= temp
->code
;
454 int64_t insn_size
= calcsize(segment
, offset
, bits
,
456 itimes
= instruction
->times
;
457 if (insn_size
< 0) /* shouldn't be, on pass two */
458 error(ERR_PANIC
, "errors made it through from pass one");
461 for (j
= 0; j
< MAXPREFIX
; j
++) {
463 switch (instruction
->prefixes
[j
]) {
479 "cs segment base generated, but will be ignored in 64-bit mode");
486 "ds segment base generated, but will be ignored in 64-bit mode");
493 "es segment base generated, but will be ignored in 64-bit mode");
506 "ss segment base generated, but will be ignored in 64-bit mode");
513 "segr6 and segr7 cannot be used as prefixes");
518 "16-bit addressing is not supported "
520 } else if (bits
!= 16)
530 "64-bit addressing is only supported "
554 error(ERR_PANIC
, "invalid instruction prefix");
557 out(offset
, segment
, &c
, OUT_RAWDATA
, 1,
562 insn_end
= offset
+ insn_size
;
563 gencode(segment
, offset
, bits
, instruction
, codes
,
566 if (itimes
> 0 && itimes
== instruction
->times
- 1) {
568 * Dummy call to list->output to give the offset to the
571 list
->output(offset
, NULL
, OUT_RAWDATA
, 0);
572 list
->uplevel(LIST_TIMES
);
575 if (instruction
->times
> 1)
576 list
->downlevel(LIST_TIMES
);
577 return offset
- start
;
578 } else if (m
> 0 && m
> size_prob
) {
584 if (temp
->opcode
== -1) { /* didn't match any instruction */
587 error(ERR_NONFATAL
, "operation size not specified");
590 error(ERR_NONFATAL
, "mismatch in operand sizes");
593 error(ERR_NONFATAL
, "no instruction for this cpu level");
596 error(ERR_NONFATAL
, "instruction not supported in 64-bit mode");
600 "invalid combination of opcode and operands");
607 int64_t insn_size(int32_t segment
, int64_t offset
, int bits
, uint32_t cp
,
608 insn
* instruction
, efunc error
)
610 const struct itemplate
*temp
;
612 errfunc
= error
; /* to pass to other functions */
615 if (instruction
->opcode
== -1)
618 if (instruction
->opcode
== I_DB
|| instruction
->opcode
== I_DW
||
619 instruction
->opcode
== I_DD
|| instruction
->opcode
== I_DQ
||
620 instruction
->opcode
== I_DT
|| instruction
->opcode
== I_DO
||
621 instruction
->opcode
== I_DY
) {
623 int32_t isize
, osize
, wsize
= 0; /* placate gcc */
626 switch (instruction
->opcode
) {
652 for (e
= instruction
->eops
; e
; e
= e
->next
) {
656 if (e
->type
== EOT_DB_NUMBER
)
658 else if (e
->type
== EOT_DB_STRING
||
659 e
->type
== EOT_DB_STRING_FREE
)
660 osize
= e
->stringlen
;
662 align
= (-osize
) % wsize
;
665 isize
+= osize
+ align
;
667 return isize
* instruction
->times
;
670 if (instruction
->opcode
== I_INCBIN
) {
671 const char *fname
= instruction
->eops
->stringval
;
675 fp
= fopen(fname
, "rb");
677 error(ERR_NONFATAL
, "`incbin': unable to open file `%s'",
679 else if (fseek(fp
, 0L, SEEK_END
) < 0)
680 error(ERR_NONFATAL
, "`incbin': unable to seek on file `%s'",
685 if (instruction
->eops
->next
) {
686 len
-= instruction
->eops
->next
->offset
;
687 if (instruction
->eops
->next
->next
&&
688 len
> (size_t)instruction
->eops
->next
->next
->offset
) {
689 len
= (size_t)instruction
->eops
->next
->next
->offset
;
692 return instruction
->times
* len
;
694 return 0; /* if we're here, there's an error */
697 /* Check to see if we need an address-size prefix */
698 add_asp(instruction
, bits
);
700 for (temp
= nasm_instructions
[instruction
->opcode
]; temp
->opcode
!= -1; temp
++) {
701 int m
= matches(temp
, instruction
, bits
);
703 m
+= jmp_match(segment
, offset
, bits
, instruction
, temp
->code
);
706 /* we've matched an instruction. */
708 const uint8_t *codes
= temp
->code
;
711 isize
= calcsize(segment
, offset
, bits
, instruction
, codes
);
714 for (j
= 0; j
< MAXPREFIX
; j
++) {
715 switch (instruction
->prefixes
[j
]) {
741 return isize
* instruction
->times
;
744 return -1; /* didn't match any instruction */
747 static bool possible_sbyte(operand
*o
)
749 return !(o
->opflags
& OPFLAG_FORWARD
) &&
750 optimizing
>= 0 && !(o
->type
& STRICT
) &&
751 o
->wrt
== NO_SEG
&& o
->segment
== NO_SEG
;
754 /* check that opn[op] is a signed byte of size 16 or 32 */
755 static bool is_sbyte16(operand
*o
)
759 if (!possible_sbyte(o
))
763 return v
>= -128 && v
<= 127;
766 static bool is_sbyte32(operand
*o
)
770 if (!possible_sbyte(o
))
774 return v
>= -128 && v
<= 127;
777 /* check that opn[op] is a signed byte of size 32; warn if this is not
778 the original value when extended to 64 bits */
779 static bool is_sbyte64(operand
*o
)
784 /* dead in the water on forward reference or External */
785 if (!possible_sbyte(o
))
791 warn_overflow(32, v64
);
793 return v32
>= -128 && v32
<= 127;
795 static int64_t calcsize(int32_t segment
, int64_t offset
, int bits
,
796 insn
* ins
, const uint8_t *codes
)
803 ins
->rex
= 0; /* Ensure REX is reset */
805 if (ins
->prefixes
[PPS_OSIZE
] == P_O64
)
808 (void)segment
; /* Don't warn that this parameter is unused */
809 (void)offset
; /* Don't warn that this parameter is unused */
813 opx
= &ins
->oprs
[c
& 3];
818 codes
+= c
, length
+= c
;
831 op_rexflags(opx
, REX_B
|REX_H
|REX_P
|REX_W
);
862 if (opx
->type
& (BITS16
| BITS32
| BITS64
))
863 length
+= (opx
->type
& BITS16
) ? 2 : 4;
865 length
+= (bits
== 16) ? 2 : 4;
877 length
+= ins
->addr_size
>> 3;
889 length
+= 8; /* MOV reg64/imm */
901 if (opx
->type
& (BITS16
| BITS32
| BITS64
))
902 length
+= (opx
->type
& BITS16
) ? 2 : 4;
904 length
+= (bits
== 16) ? 2 : 4;
922 length
+= is_sbyte16(opx
) ? 1 : 2;
935 length
+= is_sbyte32(opx
) ? 1 : 4;
950 ins
->drexdst
= regval(opx
);
957 ins
->rex
|= REX_D
|REX_OC
;
958 ins
->drexdst
= regval(opx
);
972 length
+= is_sbyte64(opx
) ? 1 : 4;
980 ins
->drexdst
= regval(opx
);
981 ins
->vex_m
= *codes
++;
982 ins
->vex_wlp
= *codes
++;
988 ins
->vex_m
= *codes
++;
989 ins
->vex_wlp
= *codes
++;
999 length
+= (bits
!= 16) && !has_prefix(ins
, PPS_ASIZE
, P_A16
);
1002 length
+= (bits
!= 32) && !has_prefix(ins
, PPS_ASIZE
, P_A32
);
1007 if (bits
!= 64 || has_prefix(ins
, PPS_ASIZE
, P_A16
) ||
1008 has_prefix(ins
, PPS_ASIZE
, P_A32
))
1017 length
+= (bits
!= 16);
1020 length
+= (bits
== 16);
1045 if (ins
->oprs
[0].segment
!= NO_SEG
)
1046 errfunc(ERR_NONFATAL
, "attempt to reserve non-constant"
1047 " quantity of BSS space");
1049 length
+= ins
->oprs
[0].offset
;
1072 default: /* can't do it by 'case' statements */
1073 if (c
>= 0100 && c
<= 0277) { /* it's an EA */
1077 ea_data
.rex
= 0; /* Ensure ea.REX is initially 0 */
1080 /* pick rfield from operand b */
1081 rflags
= regflag(&ins
->oprs
[c
& 7]);
1082 rfield
= nasm_regvals
[ins
->oprs
[c
& 7].basereg
];
1089 (&ins
->oprs
[(c
>> 3) & 7], &ea_data
, bits
,
1090 ins
->addr_size
, rfield
, rflags
)) {
1091 errfunc(ERR_NONFATAL
, "invalid effective address");
1094 ins
->rex
|= ea_data
.rex
;
1095 length
+= ea_data
.size
;
1098 errfunc(ERR_PANIC
, "internal instruction table corrupt"
1099 ": instruction code 0x%02X given", c
);
1104 ins
->rex
&= rex_mask
;
1106 if (ins
->rex
& REX_V
) {
1107 int bad32
= REX_R
|REX_W
|REX_X
|REX_B
;
1109 if (ins
->rex
& REX_H
) {
1110 errfunc(ERR_NONFATAL
, "cannot use high register in vex instruction");
1113 switch (ins
->vex_wlp
& 030) {
1127 if (bits
!= 64 && ((ins
->rex
& bad32
) || ins
->drexdst
> 7)) {
1128 errfunc(ERR_NONFATAL
, "invalid operands in non-64-bit mode");
1131 if (ins
->vex_m
!= 1 || (ins
->rex
& (REX_W
|REX_R
|REX_B
)))
1135 } else if (ins
->rex
& REX_D
) {
1136 if (ins
->rex
& REX_H
) {
1137 errfunc(ERR_NONFATAL
, "cannot use high register in drex instruction");
1140 if (bits
!= 64 && ((ins
->rex
& (REX_R
|REX_W
|REX_X
|REX_B
)) ||
1141 ins
->drexdst
> 7)) {
1142 errfunc(ERR_NONFATAL
, "invalid operands in non-64-bit mode");
1146 } else if (ins
->rex
& REX_REAL
) {
1147 if (ins
->rex
& REX_H
) {
1148 errfunc(ERR_NONFATAL
, "cannot use high register in rex instruction");
1150 } else if (bits
== 64) {
1152 } else if ((ins
->rex
& REX_L
) &&
1153 !(ins
->rex
& (REX_P
|REX_W
|REX_X
|REX_B
)) &&
1156 assert_no_prefix(ins
, PPS_LREP
);
1159 errfunc(ERR_NONFATAL
, "invalid operands in non-64-bit mode");
1167 #define EMIT_REX() \
1168 if (!(ins->rex & (REX_D|REX_V)) && (ins->rex & REX_REAL) && (bits == 64)) { \
1169 ins->rex = (ins->rex & REX_REAL)|REX_P; \
1170 out(offset, segment, &ins->rex, OUT_RAWDATA, 1, NO_SEG, NO_SEG); \
1175 static void gencode(int32_t segment
, int64_t offset
, int bits
,
1176 insn
* ins
, const uint8_t *codes
, int64_t insn_end
)
1178 static char condval
[] = { /* conditional opcodes */
1179 0x7, 0x3, 0x2, 0x6, 0x2, 0x4, 0xF, 0xD, 0xC, 0xE, 0x6, 0x2,
1180 0x3, 0x7, 0x3, 0x5, 0xE, 0xC, 0xD, 0xF, 0x1, 0xB, 0x9, 0x5,
1181 0x0, 0xA, 0xA, 0xB, 0x8, 0x4
1187 struct operand
*opx
;
1191 opx
= &ins
->oprs
[c
& 3];
1197 out(offset
, segment
, codes
, OUT_RAWDATA
, c
, NO_SEG
, NO_SEG
);
1204 switch (ins
->oprs
[0].basereg
) {
1206 bytes
[0] = 0x0E + (c
== 0x04 ? 1 : 0);
1209 bytes
[0] = 0x1E + (c
== 0x04 ? 1 : 0);
1212 bytes
[0] = 0x06 + (c
== 0x04 ? 1 : 0);
1215 bytes
[0] = 0x16 + (c
== 0x04 ? 1 : 0);
1219 "bizarre 8086 segment register received");
1221 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1227 switch (ins
->oprs
[0].basereg
) {
1229 bytes
[0] = 0xA0 + (c
== 0x05 ? 1 : 0);
1232 bytes
[0] = 0xA8 + (c
== 0x05 ? 1 : 0);
1236 "bizarre 386 segment register received");
1238 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1247 bytes
[0] = *codes
++ + ((regval(opx
)) & 7);
1248 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1256 /* XXX: warns for legitimate optimizer actions */
1257 if (opx
->offset
< -128 || opx
->offset
> 127) {
1258 errfunc(ERR_WARNING
| ERR_WARN_NOV
,
1259 "signed byte value exceeds bounds");
1262 if (opx
->segment
!= NO_SEG
) {
1264 out(offset
, segment
, &data
, OUT_ADDRESS
, 1,
1265 opx
->segment
, opx
->wrt
);
1267 bytes
[0] = opx
->offset
;
1268 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
,
1278 if (opx
->offset
< -256 || opx
->offset
> 255) {
1279 errfunc(ERR_WARNING
| ERR_WARN_NOV
,
1280 "byte value exceeds bounds");
1282 if (opx
->segment
!= NO_SEG
) {
1284 out(offset
, segment
, &data
, OUT_ADDRESS
, 1,
1285 opx
->segment
, opx
->wrt
);
1287 bytes
[0] = opx
->offset
;
1288 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
,
1298 if (opx
->offset
< 0 || opx
->offset
> 255)
1299 errfunc(ERR_WARNING
| ERR_WARN_NOV
,
1300 "unsigned byte value exceeds bounds");
1301 if (opx
->segment
!= NO_SEG
) {
1303 out(offset
, segment
, &data
, OUT_ADDRESS
, 1,
1304 opx
->segment
, opx
->wrt
);
1306 bytes
[0] = opx
->offset
;
1307 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
,
1318 if (opx
->segment
== NO_SEG
&& opx
->wrt
== NO_SEG
)
1319 warn_overflow(2, data
);
1320 out(offset
, segment
, &data
, OUT_ADDRESS
, 2,
1321 opx
->segment
, opx
->wrt
);
1329 if (opx
->type
& (BITS16
| BITS32
))
1330 size
= (opx
->type
& BITS16
) ? 2 : 4;
1332 size
= (bits
== 16) ? 2 : 4;
1334 if (opx
->segment
== NO_SEG
&& opx
->wrt
== NO_SEG
)
1335 warn_overflow(size
, data
);
1336 out(offset
, segment
, &data
, OUT_ADDRESS
, size
,
1337 opx
->segment
, opx
->wrt
);
1346 if (opx
->segment
== NO_SEG
&& opx
->wrt
== NO_SEG
)
1347 warn_overflow(4, data
);
1348 out(offset
, segment
, &data
, OUT_ADDRESS
, 4,
1349 opx
->segment
, opx
->wrt
);
1358 size
= ins
->addr_size
>> 3;
1359 if (opx
->segment
== NO_SEG
&&
1361 warn_overflow(size
, data
);
1362 out(offset
, segment
, &data
, OUT_ADDRESS
, size
,
1363 opx
->segment
, opx
->wrt
);
1371 if (opx
->segment
!= segment
)
1372 errfunc(ERR_NONFATAL
,
1373 "short relative jump outside segment");
1374 data
= opx
->offset
- insn_end
;
1375 if (data
> 127 || data
< -128)
1376 errfunc(ERR_NONFATAL
, "short jump is out of range");
1378 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1386 data
= (int64_t)opx
->offset
;
1387 out(offset
, segment
, &data
, OUT_ADDRESS
, 8,
1388 opx
->segment
, opx
->wrt
);
1396 if (opx
->segment
!= segment
) {
1398 out(offset
, segment
, &data
,
1399 OUT_REL2ADR
, insn_end
- offset
,
1400 opx
->segment
, opx
->wrt
);
1402 data
= opx
->offset
- insn_end
;
1403 out(offset
, segment
, &data
,
1404 OUT_ADDRESS
, 2, NO_SEG
, NO_SEG
);
1413 if (opx
->type
& (BITS16
| BITS32
| BITS64
))
1414 size
= (opx
->type
& BITS16
) ? 2 : 4;
1416 size
= (bits
== 16) ? 2 : 4;
1417 if (opx
->segment
!= segment
) {
1419 out(offset
, segment
, &data
,
1420 size
== 2 ? OUT_REL2ADR
: OUT_REL4ADR
,
1421 insn_end
- offset
, opx
->segment
, opx
->wrt
);
1423 data
= opx
->offset
- insn_end
;
1424 out(offset
, segment
, &data
,
1425 OUT_ADDRESS
, size
, NO_SEG
, NO_SEG
);
1434 if (opx
->segment
!= segment
) {
1436 out(offset
, segment
, &data
,
1437 OUT_REL4ADR
, insn_end
- offset
,
1438 opx
->segment
, opx
->wrt
);
1440 data
= opx
->offset
- insn_end
;
1441 out(offset
, segment
, &data
,
1442 OUT_ADDRESS
, 4, NO_SEG
, NO_SEG
);
1451 if (opx
->segment
== NO_SEG
)
1452 errfunc(ERR_NONFATAL
, "value referenced by FAR is not"
1455 out(offset
, segment
, &data
, OUT_ADDRESS
, 2,
1456 outfmt
->segbase(1 + opx
->segment
),
1466 if (is_sbyte16(opx
)) {
1468 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
,
1472 if (opx
->segment
== NO_SEG
&&
1474 warn_overflow(2, data
);
1475 out(offset
, segment
, &data
, OUT_ADDRESS
, 2,
1476 opx
->segment
, opx
->wrt
);
1486 bytes
[0] = *codes
++;
1487 if (is_sbyte16(opx
))
1488 bytes
[0] |= 2; /* s-bit */
1489 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1498 if (is_sbyte32(opx
)) {
1500 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
,
1504 out(offset
, segment
, &data
, OUT_ADDRESS
, 4,
1505 opx
->segment
, opx
->wrt
);
1515 bytes
[0] = *codes
++;
1516 if (is_sbyte32(opx
))
1517 bytes
[0] |= 2; /* s-bit */
1518 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1534 (ins
->drexdst
<< 4) |
1535 (ins
->rex
& REX_OC
? 0x08 : 0) |
1536 (ins
->rex
& (REX_R
|REX_X
|REX_B
));
1538 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1544 opx
= &ins
->oprs
[c
>> 3];
1545 bytes
[0] = nasm_regvals
[opx
->basereg
] << 4;
1546 opx
= &ins
->oprs
[c
& 7];
1547 if (opx
->segment
!= NO_SEG
|| opx
->wrt
!= NO_SEG
) {
1548 errfunc(ERR_NONFATAL
,
1549 "non-absolute expression not permitted as argument %d",
1552 if (opx
->offset
& ~15) {
1553 errfunc(ERR_WARNING
| ERR_WARN_NOV
,
1554 "four-bit argument exceeds bounds");
1556 bytes
[0] |= opx
->offset
& 15;
1558 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1564 opx
= &ins
->oprs
[c
>> 4];
1565 bytes
[0] = nasm_regvals
[opx
->basereg
] << 4;
1567 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1573 opx
= &ins
->oprs
[c
];
1574 bytes
[0] = nasm_regvals
[opx
->basereg
] << 4;
1575 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1584 /* is_sbyte32() is right here, we have already warned */
1585 if (is_sbyte32(opx
)) {
1587 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
,
1591 out(offset
, segment
, &data
, OUT_ADDRESS
, 4,
1592 opx
->segment
, opx
->wrt
);
1603 if (ins
->vex_m
!= 1 || (ins
->rex
& (REX_W
|REX_X
|REX_B
))) {
1605 bytes
[1] = ins
->vex_m
| ((~ins
->rex
& 7) << 5);
1606 bytes
[2] = ((ins
->rex
& REX_W
) << (7-3)) |
1607 ((~ins
->drexdst
& 15)<< 3) | (ins
->vex_wlp
& 07);
1608 out(offset
, segment
, &bytes
, OUT_RAWDATA
, 3, NO_SEG
, NO_SEG
);
1612 bytes
[1] = ((~ins
->rex
& REX_R
) << (7-2)) |
1613 ((~ins
->drexdst
& 15) << 3) | (ins
->vex_wlp
& 07);
1614 out(offset
, segment
, &bytes
, OUT_RAWDATA
, 2, NO_SEG
, NO_SEG
);
1626 if (bits
== 32 && !has_prefix(ins
, PPS_ASIZE
, P_A16
)) {
1628 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1635 if (bits
!= 32 && !has_prefix(ins
, PPS_ASIZE
, P_A32
)) {
1637 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1659 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1668 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1683 *bytes
= *codes
++ ^ condval
[ins
->condition
];
1684 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1693 *bytes
= c
- 0332 + 0xF2;
1694 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1699 if (ins
->rex
& REX_R
) {
1701 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1704 ins
->rex
&= ~(REX_L
|REX_R
);
1711 if (ins
->oprs
[0].segment
!= NO_SEG
)
1712 errfunc(ERR_PANIC
, "non-constant BSS size in pass two");
1714 int64_t size
= ins
->oprs
[0].offset
;
1716 out(offset
, segment
, NULL
,
1717 OUT_RESERVE
, size
, NO_SEG
, NO_SEG
);
1727 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1733 bytes
[0] = c
- 0362 + 0xf2;
1734 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1744 *bytes
= c
- 0366 + 0x66;
1745 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1755 *bytes
= bits
== 16 ? 3 : 5;
1756 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1, NO_SEG
, NO_SEG
);
1760 default: /* can't do it by 'case' statements */
1761 if (c
>= 0100 && c
<= 0277) { /* it's an EA */
1769 /* pick rfield from operand b */
1770 rflags
= regflag(&ins
->oprs
[c
& 7]);
1771 rfield
= nasm_regvals
[ins
->oprs
[c
& 7].basereg
];
1773 /* rfield is constant */
1779 (&ins
->oprs
[(c
>> 3) & 7], &ea_data
, bits
,
1780 ins
->addr_size
, rfield
, rflags
)) {
1781 errfunc(ERR_NONFATAL
, "invalid effective address");
1786 *p
++ = ea_data
.modrm
;
1787 if (ea_data
.sib_present
)
1790 /* DREX suffixes come between the SIB and the displacement */
1791 if (ins
->rex
& REX_D
) {
1793 (ins
->drexdst
<< 4) |
1794 (ins
->rex
& REX_OC
? 0x08 : 0) |
1795 (ins
->rex
& (REX_R
|REX_X
|REX_B
));
1800 out(offset
, segment
, bytes
, OUT_RAWDATA
, s
, NO_SEG
, NO_SEG
);
1802 switch (ea_data
.bytes
) {
1806 if (ins
->oprs
[(c
>> 3) & 7].segment
!= NO_SEG
) {
1807 data
= ins
->oprs
[(c
>> 3) & 7].offset
;
1808 out(offset
, segment
, &data
, OUT_ADDRESS
, 1,
1809 ins
->oprs
[(c
>> 3) & 7].segment
,
1810 ins
->oprs
[(c
>> 3) & 7].wrt
);
1812 *bytes
= ins
->oprs
[(c
>> 3) & 7].offset
;
1813 out(offset
, segment
, bytes
, OUT_RAWDATA
, 1,
1821 data
= ins
->oprs
[(c
>> 3) & 7].offset
;
1822 warn_overflow(ea_data
.bytes
, data
);
1823 out(offset
, segment
, &data
,
1824 ea_data
.rip
? OUT_REL4ADR
: OUT_ADDRESS
,
1826 ins
->oprs
[(c
>> 3) & 7].segment
,
1827 ins
->oprs
[(c
>> 3) & 7].wrt
);
1833 errfunc(ERR_PANIC
, "internal instruction table corrupt"
1834 ": instruction code 0x%02X given", c
);
1840 static int32_t regflag(const operand
* o
)
1842 if (o
->basereg
< EXPR_REG_START
|| o
->basereg
>= REG_ENUM_LIMIT
) {
1843 errfunc(ERR_PANIC
, "invalid operand passed to regflag()");
1845 return nasm_reg_flags
[o
->basereg
];
1848 static int32_t regval(const operand
* o
)
1850 if (o
->basereg
< EXPR_REG_START
|| o
->basereg
>= REG_ENUM_LIMIT
) {
1851 errfunc(ERR_PANIC
, "invalid operand passed to regval()");
1853 return nasm_regvals
[o
->basereg
];
1856 static int op_rexflags(const operand
* o
, int mask
)
1861 if (o
->basereg
< EXPR_REG_START
|| o
->basereg
>= REG_ENUM_LIMIT
) {
1862 errfunc(ERR_PANIC
, "invalid operand passed to op_rexflags()");
1865 flags
= nasm_reg_flags
[o
->basereg
];
1866 val
= nasm_regvals
[o
->basereg
];
1868 return rexflags(val
, flags
, mask
);
1871 static int rexflags(int val
, int32_t flags
, int mask
)
1876 rex
|= REX_B
|REX_X
|REX_R
;
1879 if (!(REG_HIGH
& ~flags
)) /* AH, CH, DH, BH */
1881 else if (!(REG8
& ~flags
) && val
>= 4) /* SPL, BPL, SIL, DIL */
1887 static int matches(const struct itemplate
*itemp
, insn
* instruction
, int bits
)
1889 int i
, size
[MAX_OPERANDS
], asize
, oprs
, ret
;
1896 if (itemp
->opcode
!= instruction
->opcode
)
1900 * Count the operands
1902 if (itemp
->operands
!= instruction
->operands
)
1906 * Check that no spurious colons or TOs are present
1908 for (i
= 0; i
< itemp
->operands
; i
++)
1909 if (instruction
->oprs
[i
].type
& ~itemp
->opd
[i
] & (COLON
| TO
))
1913 * Process size flags
1915 if (itemp
->flags
& IF_ARMASK
) {
1916 memset(size
, 0, sizeof size
);
1918 i
= ((itemp
->flags
& IF_ARMASK
) >> IF_ARSHFT
) - 1;
1920 switch (itemp
->flags
& IF_SMASK
) {
1957 switch (itemp
->flags
& IF_SMASK
) {
1992 for (i
= 0; i
< MAX_OPERANDS
; i
++)
1997 * Check that the operand flags all match up
1999 for (i
= 0; i
< itemp
->operands
; i
++) {
2000 int32_t type
= instruction
->oprs
[i
].type
;
2001 if (!(type
& SIZE_MASK
))
2004 if (itemp
->opd
[i
] & SAME_AS
) {
2005 int j
= itemp
->opd
[i
] & ~SAME_AS
;
2006 if (type
!= instruction
->oprs
[j
].type
||
2007 instruction
->oprs
[i
].basereg
!= instruction
->oprs
[j
].basereg
)
2009 } else if (itemp
->opd
[i
] & ~type
||
2010 ((itemp
->opd
[i
] & SIZE_MASK
) &&
2011 ((itemp
->opd
[i
] ^ type
) & SIZE_MASK
))) {
2012 if ((itemp
->opd
[i
] & ~type
& ~SIZE_MASK
) ||
2021 * Check operand sizes
2023 if (itemp
->flags
& (IF_SM
| IF_SM2
)) {
2024 oprs
= (itemp
->flags
& IF_SM2
? 2 : itemp
->operands
);
2026 for (i
= 0; i
< oprs
; i
++) {
2027 if ((asize
= itemp
->opd
[i
] & SIZE_MASK
) != 0) {
2029 for (j
= 0; j
< oprs
; j
++)
2035 oprs
= itemp
->operands
;
2038 for (i
= 0; i
< itemp
->operands
; i
++) {
2039 if (!(itemp
->opd
[i
] & SIZE_MASK
) &&
2040 (instruction
->oprs
[i
].type
& SIZE_MASK
& ~size
[i
]))
2045 * Check template is okay at the set cpu level
2047 if (((itemp
->flags
& IF_PLEVEL
) > cpu
))
2051 * Check if instruction is available in long mode
2053 if ((itemp
->flags
& IF_NOLONG
) && (bits
== 64))
2057 * Check if special handling needed for Jumps
2059 if ((uint8_t)(itemp
->code
[0]) >= 0370)
2065 static ea
*process_ea(operand
* input
, ea
* output
, int bits
,
2066 int addrbits
, int rfield
, int32_t rflags
)
2068 bool forw_ref
= !!(input
->opflags
& OPFLAG_FORWARD
);
2070 output
->rip
= false;
2072 /* REX flags for the rfield operand */
2073 output
->rex
|= rexflags(rfield
, rflags
, REX_R
|REX_P
|REX_W
|REX_H
);
2075 if (!(REGISTER
& ~input
->type
)) { /* register direct */
2079 if (input
->basereg
< EXPR_REG_START
/* Verify as Register */
2080 || input
->basereg
>= REG_ENUM_LIMIT
)
2083 i
= nasm_regvals
[input
->basereg
];
2086 return NULL
; /* Invalid EA register */
2088 output
->rex
|= op_rexflags(input
, REX_B
|REX_P
|REX_W
|REX_H
);
2090 output
->sib_present
= false; /* no SIB necessary */
2091 output
->bytes
= 0; /* no offset necessary either */
2092 output
->modrm
= 0xC0 | ((rfield
& 7) << 3) | (i
& 7);
2093 } else { /* it's a memory reference */
2094 if (input
->basereg
== -1
2095 && (input
->indexreg
== -1 || input
->scale
== 0)) {
2096 /* it's a pure offset */
2097 if (bits
== 64 && (~input
->type
& IP_REL
)) {
2098 int scale
, index
, base
;
2099 output
->sib_present
= true;
2103 output
->sib
= (scale
<< 6) | (index
<< 3) | base
;
2105 output
->modrm
= 4 | ((rfield
& 7) << 3);
2106 output
->rip
= false;
2108 output
->sib_present
= false;
2109 output
->bytes
= (addrbits
!= 16 ? 4 : 2);
2110 output
->modrm
= (addrbits
!= 16 ? 5 : 6) | ((rfield
& 7) << 3);
2111 output
->rip
= bits
== 64;
2113 } else { /* it's an indirection */
2114 int i
= input
->indexreg
, b
= input
->basereg
, s
= input
->scale
;
2115 int32_t o
= input
->offset
, seg
= input
->segment
;
2116 int hb
= input
->hintbase
, ht
= input
->hinttype
;
2119 int32_t ix
, bx
; /* register flags */
2122 i
= -1; /* make this easy, at least */
2124 if (i
>= EXPR_REG_START
&& i
< REG_ENUM_LIMIT
) {
2125 it
= nasm_regvals
[i
];
2126 ix
= nasm_reg_flags
[i
];
2132 if (b
>= EXPR_REG_START
&& b
< REG_ENUM_LIMIT
) {
2133 bt
= nasm_regvals
[b
];
2134 bx
= nasm_reg_flags
[b
];
2140 /* check for a 32/64-bit memory reference... */
2141 if ((ix
|bx
) & (BITS32
|BITS64
)) {
2142 /* it must be a 32/64-bit memory reference. Firstly we have
2143 * to check that all registers involved are type E/Rxx. */
2144 int32_t sok
= BITS32
|BITS64
;
2147 if (!(REG64
& ~ix
) || !(REG32
& ~ix
))
2155 return NULL
; /* Invalid register */
2156 if (~sok
& bx
& SIZE_MASK
)
2157 return NULL
; /* Invalid size */
2161 /* While we're here, ensure the user didn't specify
2163 if (input
->disp_size
== 16 || input
->disp_size
== 64)
2166 if (addrbits
== 16 ||
2167 (addrbits
== 32 && !(sok
& BITS32
)) ||
2168 (addrbits
== 64 && !(sok
& BITS64
)))
2171 /* now reorganize base/index */
2172 if (s
== 1 && bt
!= it
&& bt
!= -1 && it
!= -1 &&
2173 ((hb
== b
&& ht
== EAH_NOTBASE
)
2174 || (hb
== i
&& ht
== EAH_MAKEBASE
))) {
2175 /* swap if hints say so */
2176 t
= bt
, bt
= it
, it
= t
;
2177 t
= bx
, bx
= ix
, ix
= t
;
2179 if (bt
== it
) /* convert EAX+2*EAX to 3*EAX */
2180 bt
= -1, bx
= 0, s
++;
2181 if (bt
== -1 && s
== 1 && !(hb
== it
&& ht
== EAH_NOTBASE
)) {
2182 /* make single reg base, unless hint */
2183 bt
= it
, bx
= ix
, it
= -1, ix
= 0;
2185 if (((s
== 2 && it
!= REG_NUM_ESP
2186 && !(input
->eaflags
& EAF_TIMESTWO
)) || s
== 3
2187 || s
== 5 || s
== 9) && bt
== -1)
2188 bt
= it
, bx
= ix
, s
--; /* convert 3*EAX to EAX+2*EAX */
2189 if (it
== -1 && (bt
& 7) != REG_NUM_ESP
2190 && (input
->eaflags
& EAF_TIMESTWO
))
2191 it
= bt
, ix
= bx
, bt
= -1, bx
= 0, s
= 1;
2192 /* convert [NOSPLIT EAX] to sib format with 0x0 displacement */
2193 if (s
== 1 && it
== REG_NUM_ESP
) {
2194 /* swap ESP into base if scale is 1 */
2195 t
= it
, it
= bt
, bt
= t
;
2196 t
= ix
, ix
= bx
, bx
= t
;
2198 if (it
== REG_NUM_ESP
2199 || (s
!= 1 && s
!= 2 && s
!= 4 && s
!= 8 && it
!= -1))
2200 return NULL
; /* wrong, for various reasons */
2202 output
->rex
|= rexflags(it
, ix
, REX_X
);
2203 output
->rex
|= rexflags(bt
, bx
, REX_B
);
2205 if (it
== -1 && (bt
& 7) != REG_NUM_ESP
) {
2214 if (rm
!= REG_NUM_EBP
&& o
== 0 &&
2215 seg
== NO_SEG
&& !forw_ref
&&
2217 (EAF_BYTEOFFS
| EAF_WORDOFFS
)))
2219 else if (input
->eaflags
& EAF_BYTEOFFS
||
2220 (o
>= -128 && o
<= 127 && seg
== NO_SEG
2222 && !(input
->eaflags
& EAF_WORDOFFS
)))
2228 output
->sib_present
= false;
2229 output
->bytes
= (bt
== -1 || mod
== 2 ? 4 : mod
);
2230 output
->modrm
= (mod
<< 6) | ((rfield
& 7) << 3) | rm
;
2233 int mod
, scale
, index
, base
;
2253 default: /* then what the smeg is it? */
2254 return NULL
; /* panic */
2262 if (base
!= REG_NUM_EBP
&& o
== 0 &&
2263 seg
== NO_SEG
&& !forw_ref
&&
2265 (EAF_BYTEOFFS
| EAF_WORDOFFS
)))
2267 else if (input
->eaflags
& EAF_BYTEOFFS
||
2268 (o
>= -128 && o
<= 127 && seg
== NO_SEG
2270 && !(input
->eaflags
& EAF_WORDOFFS
)))
2276 output
->sib_present
= true;
2277 output
->bytes
= (bt
== -1 || mod
== 2 ? 4 : mod
);
2278 output
->modrm
= (mod
<< 6) | ((rfield
& 7) << 3) | 4;
2279 output
->sib
= (scale
<< 6) | (index
<< 3) | base
;
2281 } else { /* it's 16-bit */
2284 /* check for 64-bit long mode */
2288 /* check all registers are BX, BP, SI or DI */
2289 if ((b
!= -1 && b
!= R_BP
&& b
!= R_BX
&& b
!= R_SI
2290 && b
!= R_DI
) || (i
!= -1 && i
!= R_BP
&& i
!= R_BX
2291 && i
!= R_SI
&& i
!= R_DI
))
2294 /* ensure the user didn't specify DWORD/QWORD */
2295 if (input
->disp_size
== 32 || input
->disp_size
== 64)
2298 if (s
!= 1 && i
!= -1)
2299 return NULL
; /* no can do, in 16-bit EA */
2300 if (b
== -1 && i
!= -1) {
2305 if ((b
== R_SI
|| b
== R_DI
) && i
!= -1) {
2310 /* have BX/BP as base, SI/DI index */
2312 return NULL
; /* shouldn't ever happen, in theory */
2313 if (i
!= -1 && b
!= -1 &&
2314 (i
== R_BP
|| i
== R_BX
|| b
== R_SI
|| b
== R_DI
))
2315 return NULL
; /* invalid combinations */
2316 if (b
== -1) /* pure offset: handled above */
2317 return NULL
; /* so if it gets to here, panic! */
2321 switch (i
* 256 + b
) {
2322 case R_SI
* 256 + R_BX
:
2325 case R_DI
* 256 + R_BX
:
2328 case R_SI
* 256 + R_BP
:
2331 case R_DI
* 256 + R_BP
:
2349 if (rm
== -1) /* can't happen, in theory */
2350 return NULL
; /* so panic if it does */
2352 if (o
== 0 && seg
== NO_SEG
&& !forw_ref
&& rm
!= 6 &&
2353 !(input
->eaflags
& (EAF_BYTEOFFS
| EAF_WORDOFFS
)))
2355 else if (input
->eaflags
& EAF_BYTEOFFS
||
2356 (o
>= -128 && o
<= 127 && seg
== NO_SEG
2358 && !(input
->eaflags
& EAF_WORDOFFS
)))
2363 output
->sib_present
= false; /* no SIB - it's 16-bit */
2364 output
->bytes
= mod
; /* bytes of offset needed */
2365 output
->modrm
= (mod
<< 6) | ((rfield
& 7) << 3) | rm
;
2370 output
->size
= 1 + output
->sib_present
+ output
->bytes
;
2374 static void add_asp(insn
*ins
, int addrbits
)
2379 valid
= (addrbits
== 64) ? 64|32 : 32|16;
2381 switch (ins
->prefixes
[PPS_ASIZE
]) {
2392 valid
&= (addrbits
== 32) ? 16 : 32;
2398 for (j
= 0; j
< ins
->operands
; j
++) {
2399 if (!(MEMORY
& ~ins
->oprs
[j
].type
)) {
2402 /* Verify as Register */
2403 if (ins
->oprs
[j
].indexreg
< EXPR_REG_START
2404 || ins
->oprs
[j
].indexreg
>= REG_ENUM_LIMIT
)
2407 i
= nasm_reg_flags
[ins
->oprs
[j
].indexreg
];
2409 /* Verify as Register */
2410 if (ins
->oprs
[j
].basereg
< EXPR_REG_START
2411 || ins
->oprs
[j
].basereg
>= REG_ENUM_LIMIT
)
2414 b
= nasm_reg_flags
[ins
->oprs
[j
].basereg
];
2416 if (ins
->oprs
[j
].scale
== 0)
2420 int ds
= ins
->oprs
[j
].disp_size
;
2421 if ((addrbits
!= 64 && ds
> 8) ||
2422 (addrbits
== 64 && ds
== 16))
2442 if (valid
& addrbits
) {
2443 ins
->addr_size
= addrbits
;
2444 } else if (valid
& ((addrbits
== 32) ? 16 : 32)) {
2445 /* Add an address size prefix */
2446 enum prefixes pref
= (addrbits
== 32) ? P_A16
: P_A32
;
2447 ins
->prefixes
[PPS_ASIZE
] = pref
;
2448 ins
->addr_size
= (addrbits
== 32) ? 16 : 32;
2451 errfunc(ERR_NONFATAL
, "impossible combination of address sizes");
2452 ins
->addr_size
= addrbits
; /* Error recovery */
2455 defdisp
= ins
->addr_size
== 16 ? 16 : 32;
2457 for (j
= 0; j
< ins
->operands
; j
++) {
2458 if (!(MEM_OFFS
& ~ins
->oprs
[j
].type
) &&
2459 (ins
->oprs
[j
].disp_size
? ins
->oprs
[j
].disp_size
: defdisp
)
2460 != ins
->addr_size
) {
2461 /* mem_offs sizes must match the address size; if not,
2462 strip the MEM_OFFS bit and match only EA instructions */
2463 ins
->oprs
[j
].type
&= ~(MEM_OFFS
& ~MEMORY
);