90
ff
ff
-8d
-b4
-26
-00
-00
-00
-00
-8d
-bc
-27
-00
-00
-00
-00
+eb
+0c
+90
+90
+90
+90
+90
+90
+90
+90
+90
+90
+90
+90
ff
ff
ff
-8d
-b6
-00
-00
-00
-00
-8d
-bc
-27
-00
-00
-00
-00
+eb
+0b
+90
+90
+90
+90
+90
+90
+90
+90
+90
+90
+90
ff
ff
ff
ff
-8d
-b6
-00
-00
-00
-00
-8d
-bf
-00
-00
-00
-00
+eb
+0a
+90
+90
+90
+90
+90
+90
+90
+90
+90
+90
ff
ff
ff
ff
ff
-8d
-74
-26
-00
-8d
-bc
-27
-00
-00
-00
-00
+eb
+09
+90
+90
+90
+90
+90
+90
+90
+90
+90
ff
ff
ff
ff
ff
ff
-8d
-76
-00
-8d
-bc
-27
-00
-00
-00
-00
+eb
+08
+90
+90
+90
+90
+90
+90
+90
+90
ff
ff
ff
ff
ff
ff
-89
-f6
-8d
-bc
-27
-00
-00
-00
-00
+eb
+07
+90
+90
+90
+90
+90
+90
+90
ff
ff
ff
"\x8d\x74\x00" /* 7 - lea si, [si+byte 0] */
"\x8d\xbd\x00\x00", /* lea di, [di+word 0] */
"\x8d\xb4\x00\x00" /* 8 - lea si, [si+word 0] */
- "\x8d\xbd\x00\x00" /* lea di, [di+word 0] */
+ "\x8d\xbd\x00\x00", /* lea di, [di+word 0] */
"\xeb\x07\x90\x90\x90\x90\x90" /* 9 - jmp $+9; nop fill */
"\x90\x90",
"\xeb\x08\x90\x90\x90\x90\x90" /* 10 - jmp $+10; nop fill */
"\x8d\xb4\x26\x00\x00\x00\x00", /* 7 - lea esi, [esi*1+dword 0] */
"\x90" /* 8 - nop */
"\x8d\xb4\x26\x00\x00\x00\x00", /* lea esi, [esi*1+dword 0] */
+#if 0
+ /* GAS uses these */
"\x89\xf6" /* 9 - mov esi, esi */
"\x8d\xbc\x27\x00\x00\x00\x00", /* lea edi, [edi*1+dword 0] */
"\x8d\x76\x00" /* 10 - lea esi, [esi+byte 0] */
"\x8d\xbc\x27\x00\x00\x00\x00", /* lea edi, [edi*1+dword 0]*/
"\x8d\xb4\x26\x00\x00\x00\x00" /* 14 - lea esi, [esi*1+dword 0]*/
"\x8d\xbc\x27\x00\x00\x00\x00", /* lea edi, [edi*1+dword 0]*/
+#else
+ /* But on newer processors, these are recommended */
+ "\xeb\x07\x90\x90\x90\x90\x90" /* 9 - jmp $+9; nop fill */
+ "\x90\x90",
+ "\xeb\x08\x90\x90\x90\x90\x90" /* 10 - jmp $+10; nop fill */
+ "\x90\x90\x90",
+ "\xeb\x09\x90\x90\x90\x90\x90" /* 11 - jmp $+11; nop fill */
+ "\x90\x90\x90\x90",
+ "\xeb\x0a\x90\x90\x90\x90\x90" /* 12 - jmp $+12; nop fill */
+ "\x90\x90\x90\x90\x90",
+ "\xeb\x0b\x90\x90\x90\x90\x90" /* 13 - jmp $+13; nop fill */
+ "\x90\x90\x90\x90\x90\x90",
+ "\xeb\x0c\x90\x90\x90\x90\x90" /* 14 - jmp $+14; nop fill */
+ "\x90\x90\x90\x90\x90\x90\x90",
+#endif
"\xeb\x0d\x90\x90\x90\x90\x90" /* 15 - jmp $+15; nop fill */
"\x90\x90\x90\x90\x90\x90\x90\x90"
};
00
40
00
-00
+30
00
2e
72
00
20
00
-00
+60
00
55
89
00
00
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
+eb
+07
90
90
90
00
00
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
-90
-90
+8d
+74
+26
+00
04
00
00
00
00
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
+eb
+07
90
90
90
00
00
00
-90
-90
+eb
+0d
90
90
90
00
00
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
-90
-90
+8d
+74
+26
+00
00
00
00
00
00
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
+eb
+07
90
90
90
00
00
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
+eb
+07
90
90
90
00
00
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
+eb
+07
90
90
90
00
00
00
-90
-90
+eb
+0a
90
90
90
00
00
90
-90
-90
-90
-90
-90
-90
-90
+8d
+b4
+26
+00
+00
+00
+00
04
00
00
00
00
90
-90
-90
-90
-90
-90
-90
-90
+8d
+b4
+26
+00
+00
+00
+00
00
00
00
00
00
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
+eb
+0b
90
90
90
00
00
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
+eb
+07
90
90
90
00
00
00
-90
-90
+eb
+0d
90
90
90
00
00
00
-90
-90
+eb
+0d
90
90
90
00
00
90
-90
-90
-90
-90
-90
-90
-90
+8d
+b4
+26
+00
+00
+00
+00
00
00
00
00
00
00
-90
-90
+eb
+0a
90
90
90
00
00
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
+eb
+07
90
90
90
00
00
00
-90
-90
+eb
+0d
90
90
90
00
00
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
-90
-90
+8d
+74
+26
+00
00
00
00
00
00
00
-90
-90
+eb
+0a
90
90
90
00
00
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
+eb
+0b
90
90
90
00
00
90
-90
-90
-90
-90
-90
-90
-90
+8d
+b4
+26
+00
+00
+00
+00
00
00
00
00
00
00
-90
-90
-90
-90
+8d
+74
+26
+00
04
00
00
00
00
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
+eb
+07
90
90
90
00
00
00
-90
-90
+eb
+0d
90
90
90
00
00
00
-90
-90
+eb
+0a
90
90
90
00
00
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
-90
-90
+8d
+74
+26
+00
02
00
00
00
00
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
+eb
+07
90
90
90
00
00
00
-90
-90
+eb
+0d
90
90
90
00
00
00
-90
-90
+eb
+0d
90
90
90
00
00
00
-90
-90
+eb
+0a
90
90
90
00
00
00
-90
-90
+eb
+0d
90
90
90
00
00
00
-90
-90
+eb
+0d
90
90
90
00
00
90
-90
-90
-90
-90
-90
-90
-90
+8d
+b4
+26
+00
+00
+00
+00
00
10
00
00
00
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
+eb
+07
90
90
90
00
00
00
-90
-90
+eb
+0a
90
90
90
00
00
00
-90
-90
+eb
+0d
90
90
90
00
00
90
-90
-90
-90
-90
-90
-90
-90
+8d
+b4
+26
+00
+00
+00
+00
00
10
00
00
00
00
-90
-90
+eb
+0a
90
90
90
00
00
90
-90
-90
-90
-90
-90
-90
-90
+8d
+b4
+26
+00
+00
+00
+00
08
00
00
00
00
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
-90
-90
+8d
+74
+26
+00
20
00
00
00
00
00
-90
-90
+eb
+0d
90
90
90
00
00
00
-90
-90
+eb
+0a
90
90
90
00
00
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
-90
-90
+8d
+74
+26
+00
00
20
00
00
00
90
-90
-90
-90
-90
-90
-90
-90
+8d
+b4
+26
+00
+00
+00
+00
00
20
00
00
00
00
-90
-90
+eb
+0d
90
90
90
00
00
00
-90
-90
+eb
+0a
90
90
90
00
00
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
-90
-90
+8d
+74
+26
+00
00
40
00
00
00
00
-90
-90
+eb
+0a
90
90
90
00
00
90
-90
-90
-90
-90
-90
-90
-90
+8d
+b4
+26
+00
+00
+00
+00
40
20
00
21
00
00
-90
-90
+eb
+0d
90
90
90
21
00
00
-90
-90
+eb
+0a
90
90
90
00
00
90
-90
-90
-90
-90
-90
-90
-90
+8d
+b4
+26
+00
+00
+00
+00
00
80
00
00
00
90
-90
-90
-90
-90
-90
-90
-90
+8d
+b4
+26
+00
+00
+00
+00
00
80
00
00
00
00
-90
-90
+eb
+0d
90
90
90
00
00
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
-90
-90
+8d
+74
+26
+00
00
80
00
00
00
00
-90
-90
+eb
+0a
90
90
90
00
00
90
-90
-90
-90
-90
-90
-90
-90
+8d
+b4
+26
+00
+00
+00
+00
04
00
20
00
00
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
+eb
+07
90
90
90
00
24
00
-90
-90
-90
-90
-90
-90
-90
+8d
+b4
+26
+00
+00
+00
+00
00
00
00
65
64
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
+eb
+08
90
90
90
65
72
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
+eb
+0c
90
90
90
6f
6e
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
+eb
+0d
90
90
90
6f
6e
00
-90
-90
-90
+8d
+76
+00
af
03
00
06
00
00
-90
-90
-90
-90
+8d
+74
+26
+00
75
6e
72
15
00
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
-90
-90
+8d
+74
+26
+00
60
73
27
64
65
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
-90
-90
+8d
+74
+26
+00
43
61
6e
64
65
00
-90
-90
+eb
+07
90
90
90
64
65
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
+eb
+0d
90
90
90
00
00
00
+00
+00
+00
+00
02
00
00
00
00
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
+eb
+07
90
90
90
00
00
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
-90
-90
+8d
+74
+26
+00
04
00
00
00
00
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
+eb
+07
90
90
90
00
00
00
-90
-90
+eb
+0d
90
90
90
00
00
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
-90
-90
+8d
+74
+26
+00
00
00
00
00
00
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
+eb
+07
90
90
90
00
00
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
+eb
+07
90
90
90
00
00
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
+eb
+07
90
90
90
00
00
00
-90
-90
+eb
+0a
90
90
90
00
00
90
-90
-90
-90
-90
-90
-90
-90
+8d
+b4
+26
+00
+00
+00
+00
04
00
00
00
00
90
-90
-90
-90
-90
-90
-90
-90
+8d
+b4
+26
+00
+00
+00
+00
00
00
00
00
00
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
+eb
+0b
90
90
90
00
00
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
+eb
+07
90
90
90
00
00
00
-90
-90
+eb
+0d
90
90
90
00
00
00
-90
-90
+eb
+0d
90
90
90
00
00
90
-90
-90
-90
-90
-90
-90
-90
+8d
+b4
+26
+00
+00
+00
+00
00
00
00
00
00
00
-90
-90
+eb
+0a
90
90
90
00
00
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
+eb
+07
90
90
90
00
00
00
-90
-90
+eb
+0d
90
90
90
00
00
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
-90
-90
+8d
+74
+26
+00
00
00
00
00
00
00
-90
-90
+eb
+0a
90
90
90
00
00
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
+eb
+0b
90
90
90
00
00
90
-90
-90
-90
-90
-90
-90
-90
+8d
+b4
+26
+00
+00
+00
+00
00
00
00
00
00
00
-90
-90
-90
-90
+8d
+74
+26
+00
04
00
00
00
00
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
+eb
+07
90
90
90
00
00
00
-90
-90
+eb
+0d
90
90
90
00
00
00
-90
-90
+eb
+0a
90
90
90
00
00
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
-90
-90
+8d
+74
+26
+00
02
00
00
00
00
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
+eb
+07
90
90
90
00
00
00
-90
-90
+eb
+0d
90
90
90
00
00
00
-90
-90
+eb
+0d
90
90
90
00
00
00
-90
-90
+eb
+0a
90
90
90
00
00
00
-90
-90
+eb
+0d
90
90
90
00
00
00
-90
-90
+eb
+0d
90
90
90
00
00
90
-90
-90
-90
-90
-90
-90
-90
+8d
+b4
+26
+00
+00
+00
+00
00
10
00
00
00
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
+eb
+07
90
90
90
00
00
00
-90
-90
+eb
+0a
90
90
90
00
00
00
-90
-90
+eb
+0d
90
90
90
00
00
90
-90
-90
-90
-90
-90
-90
-90
+8d
+b4
+26
+00
+00
+00
+00
00
10
00
00
00
00
-90
-90
+eb
+0a
90
90
90
00
00
90
-90
-90
-90
-90
-90
-90
-90
+8d
+b4
+26
+00
+00
+00
+00
08
00
00
00
00
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
-90
-90
+8d
+74
+26
+00
20
00
00
00
00
00
-90
-90
+eb
+0d
90
90
90
00
00
00
-90
-90
+eb
+0a
90
90
90
00
00
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
-90
-90
+8d
+74
+26
+00
00
20
00
00
00
90
-90
-90
-90
-90
-90
-90
-90
+8d
+b4
+26
+00
+00
+00
+00
00
20
00
00
00
00
-90
-90
+eb
+0d
90
90
90
00
00
00
-90
-90
+eb
+0a
90
90
90
00
00
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
-90
-90
+8d
+74
+26
+00
00
40
00
00
00
00
-90
-90
+eb
+0a
90
90
90
00
00
90
-90
-90
-90
-90
-90
-90
-90
+8d
+b4
+26
+00
+00
+00
+00
40
20
00
21
00
00
-90
-90
+eb
+0d
90
90
90
21
00
00
-90
-90
+eb
+0a
90
90
90
00
00
90
-90
-90
-90
-90
-90
-90
-90
+8d
+b4
+26
+00
+00
+00
+00
00
80
00
00
00
90
-90
-90
-90
-90
-90
-90
-90
+8d
+b4
+26
+00
+00
+00
+00
00
80
00
00
00
00
-90
-90
+eb
+0d
90
90
90
00
00
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
-90
-90
+8d
+74
+26
+00
00
80
00
00
00
00
-90
-90
+eb
+0a
90
90
90
00
00
90
-90
-90
-90
-90
-90
-90
-90
+8d
+b4
+26
+00
+00
+00
+00
04
00
20
00
00
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
+eb
+07
90
90
90
00
24
00
-90
-90
-90
-90
-90
-90
-90
+8d
+b4
+26
+00
+00
+00
+00
00
00
00
65
64
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
+eb
+08
90
90
90
65
72
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
+eb
+0c
90
90
90
6f
6e
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
+eb
+0d
90
90
90
6f
6e
00
-90
-90
-90
+8d
+76
+00
af
03
00
06
00
00
-90
-90
-90
-90
+8d
+74
+26
+00
75
6e
72
15
00
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
-90
-90
+8d
+74
+26
+00
60
73
27
64
65
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
-90
-90
+8d
+74
+26
+00
43
61
6e
64
65
00
-90
-90
+eb
+07
90
90
90
64
65
00
+eb
+0d
90
90
90
90
90
90
-90
-90
-90
-90
+eb
+0d
90
90
90
00
00
00
-00
-00
-00
-00
3b
00
00
00
00
00
-90
+94
a2
01
00
00
00
00
-d8
+dc
a2
01
00
00
00
00
-bc
+c0
a4
01
00
00
00
00
-9c
+a0
0c
01
00
00
00
00
-04
+20
00
00
00
00
00
00
-c0
+c4
63
01
00
vp->param = NULL;
}
parser_nasm->prev_bc = yasm_section_bcs_last(parser_nasm->cur_section);
+ } else if (yasm__strcasecmp(name, "align") == 0) {
+ /*@only@*/ yasm_expr *boundval;
+ /*@depedent@*/ yasm_intnum *boundintn;
+
+ /* it can be just an ID or a complete expression, so handle both. */
+ vp = yasm_vps_first(valparams);
+ if (vp->val)
+ boundval = p_expr_new_ident(yasm_expr_sym(
+ yasm_symtab_use(p_symtab, vp->val, line)));
+ else if (vp->param) {
+ boundval = vp->param;
+ vp->param = NULL;
+ }
+
+ /* Largest .align in the section specifies section alignment.
+ * Note: this doesn't match NASM behavior, but is a lot more
+ * intelligent!
+ */
+ boundintn = yasm_expr_get_intnum(&boundval, NULL);
+ if (boundintn) {
+ unsigned long boundint = yasm_intnum_get_uint(boundintn);
+
+ /* Alignments must be a power of two. */
+ if ((boundint & (boundint - 1)) == 0) {
+ if (boundint > yasm_section_get_align(parser_nasm->cur_section))
+ yasm_section_set_align(parser_nasm->cur_section, boundint,
+ cur_line);
+ }
+ }
+
+ /* As this directive is called only when nop is used as fill, always
+ * use arch (nop) fill.
+ */
+ parser_nasm->prev_bc =
+ yasm_section_bcs_append(parser_nasm->cur_section,
+ yasm_bc_create_align(boundval, NULL, NULL,
+ /*yasm_section_is_code(parser_nasm->cur_section) ?*/
+ yasm_arch_get_fill(parser_nasm->arch)/* : NULL*/,
+ cur_line));
} else if (yasm__strcasecmp(name, "cpu") == 0) {
yasm_vps_foreach(vp, valparams) {
if (vp->val)
TESTS += modules/parsers/nasm/tests/nasm_test.sh
EXTRA_DIST += modules/parsers/nasm/tests/nasm_test.sh
+EXTRA_DIST += modules/parsers/nasm/tests/alignnop16.asm
+EXTRA_DIST += modules/parsers/nasm/tests/alignnop16.errwarn
+EXTRA_DIST += modules/parsers/nasm/tests/alignnop16.hex
+EXTRA_DIST += modules/parsers/nasm/tests/alignnop32.asm
+EXTRA_DIST += modules/parsers/nasm/tests/alignnop32.errwarn
+EXTRA_DIST += modules/parsers/nasm/tests/alignnop32.hex
EXTRA_DIST += modules/parsers/nasm/tests/endcomma.asm
EXTRA_DIST += modules/parsers/nasm/tests/endcomma.errwarn
EXTRA_DIST += modules/parsers/nasm/tests/endcomma.hex
--- /dev/null
+bits 16
+mov eax,32
+align 16
+ret
--- /dev/null
+66
+b8
+20
+00
+00
+00
+eb
+08
+90
+90
+90
+90
+90
+90
+90
+90
+c3
--- /dev/null
+bits 32
+mov eax,32
+align 16
+ret
--- /dev/null
+b8
+20
+00
+00
+00
+eb
+09
+90
+90
+90
+90
+90
+90
+90
+90
+90
+c3
%endmacro
%imacro align 1-2+.nolist nop
+%ifidni %2,nop
+ [align %1]
+%else
times ($$-$) & ((%1)-1) %2
+%endif
%endmacro
%imacro alignb 1-2+.nolist resb 1
times ($$-$) & ((%1)-1) %2