]> granicus.if.org Git - yasm/commitdiff
Fix RIP-relative effective addresses. They always have a 32-bit
authorPeter Johnson <peter@tortall.net>
Sat, 12 Jul 2003 22:55:22 +0000 (22:55 -0000)
committerPeter Johnson <peter@tortall.net>
Sat, 12 Jul 2003 22:55:22 +0000 (22:55 -0000)
displacement.
Noticed by: Ben Skeggs <darktama@dodo.com.au>

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

modules/arch/x86/tests/mem64.asm
modules/arch/x86/tests/mem64.hex
modules/arch/x86/x86expr.c

index fd773318bdcd54b51dabd515533e1a7a64572c3a..a9e1c35c6ecebacc4c5b16d1348978c13f01a8ad 100644 (file)
@@ -11,12 +11,12 @@ a32 mov rbx, [0]            ; 67 48 8B 1C 25 00 00 00 00
 mov ebx, [rcx]                 ; 8B 19
 mov r8, [r9]                   ; 4D 8B 01
 mov ecx, [ebx]                 ; 67 8B 0B
-mov edx, [rip]                 ; 8B 15
-a32 mov rcx, [rip+5]           ; 67 48 8B 4D 05
+mov edx, [rip]                 ; 8B 15 00 00 00 00
+a32 mov rcx, [rip+5]           ; 67 48 8B 0D 05 00 00 00
 mov rbx, [rax+rbx*4]           ; 48 8B 1C 98
 mov rdx, [rsp]                 ; 48 8B 14 24
 mov rax, [r12]                 ; 49 8B 04 24
 mov rcx, [rbp]                 ; 48 8B 4D 00
 mov rbx, [r13]                 ; 49 8B 5D 00
-mov ah, [rip]                  ; 8A 25
+mov ah, [rip]                  ; 8A 25 00 00 00 00
 mov bh, [rcx]                  ; 8A 39
index 691cffdfd0ce43f8d71d23735f5ed926ac75ba17..ae433679c818dc864d2edfb52cbc3d4f4bd39516 100644 (file)
@@ -80,11 +80,18 @@ a1
 0b 
 8b 
 15 
+00 
+00 
+00 
+00 
 67 
 48 
 8b 
-4
+0
 05 
+00 
+00 
+00 
 48 
 8b 
 1c 
@@ -107,5 +114,9 @@ a1
 00 
 8a 
 25 
+00 
+00 
+00 
+00 
 8a 
 39 
index e52883441f0548940a0fdc19de940ed384ac2bc7..77c2b83ecbd59684d31f12f0ff54431f4670d0e7 100644 (file)
@@ -25,7 +25,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 #include <util.h>
-/*@unused@*/ RCSID("$IdPath: yasm/modules/arch/x86/x86expr.c,v 1.54 2003/03/26 05:07:55 peter Exp $");
+/*@unused@*/ RCSID("$IdPath$");
 
 #define YASM_LIB_INTERNAL
 #define YASM_EXPR_INTERNAL
@@ -736,6 +736,10 @@ yasm_x86__expr_checkea(yasm_expr **ep, unsigned char *addrsize,
            *sib = 0;
            *v_sib = 0;
            *n_sib = 0;
+           /* RIP always requires a 32-bit displacement */
+           *v_modrm = 1;
+           *displen = 4;
+           return 1;
        } else if (indexreg == REG3264_NONE) {
            /* basereg only */
            /* Don't need to go to the full effort of determining what type