]> granicus.if.org Git - yasm/commitdiff
Follow NASM after all in only turning off default RIP-rel for FS and GS,
authorPeter Johnson <peter@tortall.net>
Thu, 20 Sep 2007 05:15:29 +0000 (05:15 -0000)
committerPeter Johnson <peter@tortall.net>
Thu, 20 Sep 2007 05:15:29 +0000 (05:15 -0000)
not all segment registers.  FS and GS are the only ones which can have
a segment base != 0.

svn path=/trunk/yasm/; revision=1971

modules/arch/x86/tests/Makefile.inc
modules/arch/x86/tests/riprel2.asm
modules/arch/x86/tests/riprel2.hex
modules/arch/x86/tests/ripseg.asm [new file with mode: 0644]
modules/arch/x86/tests/ripseg.errwarn [new file with mode: 0644]
modules/arch/x86/tests/ripseg.hex [new file with mode: 0644]
modules/arch/x86/x86id.c
modules/parsers/nasm/nasm-parse.c

index 67e8b5c68d8fd58506dbc555e0f78b37254f9817..3bd57e0e265a7fa48fce425ad5e42f50d2b49250 100644 (file)
@@ -131,6 +131,9 @@ EXTRA_DIST += modules/arch/x86/tests/riprel1.hex
 EXTRA_DIST += modules/arch/x86/tests/riprel2.asm
 EXTRA_DIST += modules/arch/x86/tests/riprel2.errwarn
 EXTRA_DIST += modules/arch/x86/tests/riprel2.hex
+EXTRA_DIST += modules/arch/x86/tests/ripseg.asm
+EXTRA_DIST += modules/arch/x86/tests/ripseg.errwarn
+EXTRA_DIST += modules/arch/x86/tests/ripseg.hex
 EXTRA_DIST += modules/arch/x86/tests/segmov.asm
 EXTRA_DIST += modules/arch/x86/tests/segmov.hex
 EXTRA_DIST += modules/arch/x86/tests/shift.asm
index 813d9e5a3469c7015ee26ec2944ebb39376dc0fd..7f3be69a1c8b596e7da6368dd0adb2c71ba2c67d 100644 (file)
@@ -69,7 +69,7 @@
        mov rax,[abs dword foo]
        mov rax,[abs qword foo]
 
-       ; all of these are abs due to es:, except for explicit rel
+       ; all of these are default rel, except for 64-bit displacements
        mov rax,[es:foo]
        mov rax,[qword es:123456789abcdef0h]
        mov rbx,[es:foo]
index 5d9a9183c89ffb867bab86162454de3ec4866008..a7b6f1127d6173149ead6767d918b49b3778dbe0 100644 (file)
@@ -2,7 +2,7 @@
 8b 
 04 
 25 
-c4 
+c0 
 02 
 00 
 00 
@@ -20,7 +20,7 @@ bc
 8b 
 1c 
 25 
-c4 
+c0 
 02 
 00 
 00 
@@ -28,7 +28,7 @@ c4
 8b 
 04 
 25 
-c4 
+c0 
 02 
 00 
 00 
@@ -36,13 +36,13 @@ c4
 8b 
 1c 
 25 
-c4 
+c0 
 02 
 00 
 00 
 48 
 a1 
-c4 
+c0 
 02 
 00 
 00 
@@ -53,21 +53,21 @@ c4
 48 
 8b 
 05 
-89 
+85 
 02 
 00 
 00 
 48 
 8b 
 1d 
-82 
+7e 
 02 
 00 
 00 
 48 
 8b 
 05 
-7b 
+77 
 02 
 00 
 00 
@@ -75,7 +75,7 @@ c4
 8b 
 04 
 25 
-c4 
+c0 
 02 
 00 
 00 
@@ -83,7 +83,7 @@ c4
 8b 
 1c 
 25 
-c4 
+c0 
 02 
 00 
 00 
@@ -91,13 +91,13 @@ c4
 8b 
 04 
 25 
-c4 
+c0 
 02 
 00 
 00 
 48 
 a1 
-c4 
+c0 
 02 
 00 
 00 
@@ -110,7 +110,7 @@ c4
 8b 
 04 
 25 
-c4 
+c0 
 02 
 00 
 00 
@@ -130,7 +130,7 @@ bc
 8b 
 1c 
 25 
-c4 
+c0 
 02 
 00 
 00 
@@ -139,7 +139,7 @@ c4
 8b 
 04 
 25 
-c4 
+c0 
 02 
 00 
 00 
@@ -148,14 +148,14 @@ c4
 8b 
 1c 
 25 
-c4 
+c0 
 02 
 00 
 00 
 26 
 48 
 a1 
-c4 
+c0 
 02 
 00 
 00 
@@ -167,7 +167,7 @@ c4
 48 
 8b 
 05 
-17 
+13 
 02 
 00 
 00 
@@ -175,7 +175,7 @@ c4
 48 
 8b 
 1d 
-0f 
+0b 
 02 
 00 
 00 
@@ -183,7 +183,7 @@ c4
 48 
 8b 
 05 
-07 
+03 
 02 
 00 
 00 
@@ -192,7 +192,7 @@ c4
 8b 
 04 
 25 
-c4 
+c0 
 02 
 00 
 00 
@@ -201,7 +201,7 @@ c4
 8b 
 1c 
 25 
-c4 
+c0 
 02 
 00 
 00 
@@ -210,14 +210,14 @@ c4
 8b 
 04 
 25 
-c4 
+c0 
 02 
 00 
 00 
 26 
 48 
 a1 
-c4 
+c0 
 02 
 00 
 00 
@@ -230,7 +230,7 @@ c4
 8b 
 04 
 25 
-c4 
+c0 
 02 
 00 
 00 
@@ -250,7 +250,7 @@ bc
 8b 
 1c 
 25 
-c4 
+c0 
 02 
 00 
 00 
@@ -259,7 +259,7 @@ c4
 8b 
 04 
 25 
-c4 
+c0 
 02 
 00 
 00 
@@ -268,14 +268,14 @@ c4
 8b 
 1c 
 25 
-c4 
+c0 
 02 
 00 
 00 
 64 
 48 
 a1 
-c4 
+c0 
 02 
 00 
 00 
@@ -287,7 +287,7 @@ c4
 48 
 8b 
 05 
-9f 
+9b 
 01 
 00 
 00 
@@ -295,7 +295,7 @@ c4
 48 
 8b 
 1d 
-97 
+93 
 01 
 00 
 00 
@@ -303,7 +303,7 @@ c4
 48 
 8b 
 05 
-8f 
+8b 
 01 
 00 
 00 
@@ -312,7 +312,7 @@ c4
 8b 
 04 
 25 
-c4 
+c0 
 02 
 00 
 00 
@@ -321,7 +321,7 @@ c4
 8b 
 1c 
 25 
-c4 
+c0 
 02 
 00 
 00 
@@ -330,14 +330,14 @@ c4
 8b 
 04 
 25 
-c4 
+c0 
 02 
 00 
 00 
 64 
 48 
 a1 
-c4 
+c0 
 02 
 00 
 00 
@@ -357,7 +357,7 @@ c4
 48 
 8b 
 05 
-59 
+55 
 01 
 00 
 00 
@@ -374,27 +374,27 @@ bc
 48 
 8b 
 1d 
-48 
+44 
 01 
 00 
 00 
 48 
 8b 
 05 
-41 
+3d 
 01 
 00 
 00 
 48 
 8b 
 1d 
-3a 
+36 
 01 
 00 
 00 
 48 
 a1 
-c4 
+c0 
 02 
 00 
 00 
@@ -405,21 +405,21 @@ c4
 48 
 8b 
 05 
-29 
+25 
 01 
 00 
 00 
 48 
 8b 
 1d 
-22 
+1e 
 01 
 00 
 00 
 48 
 8b 
 05 
-1b 
+17 
 01 
 00 
 00 
@@ -427,7 +427,7 @@ c4
 8b 
 04 
 25 
-c4 
+c0 
 02 
 00 
 00 
@@ -435,7 +435,7 @@ c4
 8b 
 1c 
 25 
-c4 
+c0 
 02 
 00 
 00 
@@ -443,13 +443,13 @@ c4
 8b 
 04 
 25 
-c4 
+c0 
 02 
 00 
 00 
 48 
 a1 
-c4 
+c0 
 02 
 00 
 00 
@@ -460,10 +460,9 @@ c4
 26 
 48 
 8b 
-04 
-25 
-c4 
-02 
+05 
+ed 
+00 
 00 
 00 
 26 
@@ -480,34 +479,31 @@ bc
 26 
 48 
 8b 
-1c 
-25 
-c4 
-02 
+1d 
+da 
+00 
 00 
 00 
 26 
 48 
 8b 
-04 
-25 
-c4 
-02 
+05 
+d2 
+00 
 00 
 00 
 26 
 48 
 8b 
-1c 
-25 
-c4 
-02 
+1d 
+ca 
+00 
 00 
 00 
 26 
 48 
 a1 
-c4 
+c0 
 02 
 00 
 00 
@@ -544,7 +540,7 @@ a7
 8b 
 04 
 25 
-c4 
+c0 
 02 
 00 
 00 
@@ -553,7 +549,7 @@ c4
 8b 
 1c 
 25 
-c4 
+c0 
 02 
 00 
 00 
@@ -562,14 +558,14 @@ c4
 8b 
 04 
 25 
-c4 
+c0 
 02 
 00 
 00 
 26 
 48 
 a1 
-c4 
+c0 
 02 
 00 
 00 
@@ -582,7 +578,7 @@ c4
 8b 
 04 
 25 
-c4 
+c0 
 02 
 00 
 00 
@@ -602,7 +598,7 @@ bc
 8b 
 1c 
 25 
-c4 
+c0 
 02 
 00 
 00 
@@ -611,7 +607,7 @@ c4
 8b 
 04 
 25 
-c4 
+c0 
 02 
 00 
 00 
@@ -620,14 +616,14 @@ c4
 8b 
 1c 
 25 
-c4 
+c0 
 02 
 00 
 00 
 64 
 48 
 a1 
-c4 
+c0 
 02 
 00 
 00 
@@ -664,7 +660,7 @@ c4
 8b 
 04 
 25 
-c4 
+c0 
 02 
 00 
 00 
@@ -673,7 +669,7 @@ c4
 8b 
 1c 
 25 
-c4 
+c0 
 02 
 00 
 00 
@@ -682,14 +678,14 @@ c4
 8b 
 04 
 25 
-c4 
+c0 
 02 
 00 
 00 
 64 
 48 
 a1 
-c4 
+c0 
 02 
 00 
 00 
diff --git a/modules/arch/x86/tests/ripseg.asm b/modules/arch/x86/tests/ripseg.asm
new file mode 100644 (file)
index 0000000..1779a1c
--- /dev/null
@@ -0,0 +1,35 @@
+bits 64
+foo:
+
+default abs
+mov rbx, [foo]
+mov rbx, [es:foo]
+mov rbx, [fs:foo]
+mov rbx, [gs:foo]
+mov rbx, [rel es:foo]
+mov rbx, [rel fs:foo]
+mov rbx, [rel gs:foo]
+mov rbx, [abs es:foo]
+mov rbx, [abs fs:foo]
+mov rbx, [abs gs:foo]
+;mov rbx, [es:rel foo]
+;mov rbx, [fs:rel foo]
+;mov rbx, [es:abs foo]
+;mov rbx, [fs:abs foo]
+
+default rel
+mov rbx, [foo]
+mov rbx, [es:foo]
+mov rbx, [fs:foo]
+mov rbx, [gs:foo]
+mov rbx, [rel es:foo]
+mov rbx, [rel fs:foo]
+mov rbx, [rel gs:foo]
+mov rbx, [abs es:foo]
+mov rbx, [abs fs:foo]
+mov rbx, [abs gs:foo]
+;mov rbx, [es:rel foo]
+;mov rbx, [fs:rel foo]
+;mov rbx, [es:abs foo]
+;mov rbx, [fs:abs foo]
+
diff --git a/modules/arch/x86/tests/ripseg.errwarn b/modules/arch/x86/tests/ripseg.errwarn
new file mode 100644 (file)
index 0000000..19782dd
--- /dev/null
@@ -0,0 +1,6 @@
+-:6: warning: `es' segment register ignored in 64-bit mode
+-:9: warning: `es' segment register ignored in 64-bit mode
+-:12: warning: `es' segment register ignored in 64-bit mode
+-:22: warning: `es' segment register ignored in 64-bit mode
+-:25: warning: `es' segment register ignored in 64-bit mode
+-:28: warning: `es' segment register ignored in 64-bit mode
diff --git a/modules/arch/x86/tests/ripseg.hex b/modules/arch/x86/tests/ripseg.hex
new file mode 100644 (file)
index 0000000..5303fe9
--- /dev/null
@@ -0,0 +1,170 @@
+48 
+8b 
+1c 
+25 
+00 
+00 
+00 
+00 
+26 
+48 
+8b 
+1c 
+25 
+00 
+00 
+00 
+00 
+64 
+48 
+8b 
+1c 
+25 
+00 
+00 
+00 
+00 
+65 
+48 
+8b 
+1c 
+25 
+00 
+00 
+00 
+00 
+26 
+48 
+8b 
+1d 
+d5 
+ff 
+ff 
+ff 
+64 
+48 
+8b 
+1d 
+cd 
+ff 
+ff 
+ff 
+65 
+48 
+8b 
+1d 
+c5 
+ff 
+ff 
+ff 
+26 
+48 
+8b 
+1c 
+25 
+00 
+00 
+00 
+00 
+64 
+48 
+8b 
+1c 
+25 
+00 
+00 
+00 
+00 
+65 
+48 
+8b 
+1c 
+25 
+00 
+00 
+00 
+00 
+48 
+8b 
+1d 
+a3 
+ff 
+ff 
+ff 
+26 
+48 
+8b 
+1d 
+9b 
+ff 
+ff 
+ff 
+64 
+48 
+8b 
+1c 
+25 
+00 
+00 
+00 
+00 
+65 
+48 
+8b 
+1c 
+25 
+00 
+00 
+00 
+00 
+26 
+48 
+8b 
+1d 
+81 
+ff 
+ff 
+ff 
+64 
+48 
+8b 
+1d 
+79 
+ff 
+ff 
+ff 
+65 
+48 
+8b 
+1d 
+71 
+ff 
+ff 
+ff 
+26 
+48 
+8b 
+1c 
+25 
+00 
+00 
+00 
+00 
+64 
+48 
+8b 
+1c 
+25 
+00 
+00 
+00 
+00 
+65 
+48 
+8b 
+1c 
+25 
+00 
+00 
+00 
+00 
index 59e74aed20b07488d5067446ad1f20e96d54f501..7312913e705a3cb53a1933e72cc2f9c4d01a0fc8 100644 (file)
@@ -1178,10 +1178,13 @@ x86_id_insn_finalize(yasm_bytecode *bc, yasm_bytecode *prev_bc)
                                 yasm_x86__ea_set_disponly(insn->x86_ea);
                             else if (id_insn->default_rel &&
                                      !op->data.ea->not_pc_rel &&
-                                     op->data.ea->segreg == 0 &&
+                                     op->data.ea->segreg != 0x6404 &&
+                                     op->data.ea->segreg != 0x6505 &&
                                      !yasm_expr__contains(
                                         op->data.ea->disp.abs, YASM_EXPR_REG))
-                                /* Enable default PC-rel if no regs/segregs */
+                                /* Enable default PC-rel if no regs and segreg
+                                 * is not FS or GS.
+                                 */
                                 insn->x86_ea->ea.pc_rel = 1;
                             break;
                         case YASM_INSN__OPERAND_IMM:
index b3927e036a8c351a612db2dc794206022fe6e434..641de04e9e9dc2e737608b3a8f7866631131a74e 100644 (file)
@@ -755,11 +755,8 @@ parse_memaddr(yasm_parser_nasm *parser_nasm)
             }
             get_next_token();
             ea = parse_memaddr(parser_nasm);
-            if (ea) {
+            if (ea)
                 yasm_ea_set_segreg(ea, segreg);
-                ea->pc_rel = 0;
-                ea->not_pc_rel = 1;
-            }
             return ea;
         }
         case SIZE_OVERRIDE: