[movitz-cvs] CVS movitz

ffjeld ffjeld at common-lisp.net
Thu Mar 6 19:14:40 UTC 2008


Update of /project/movitz/cvsroot/movitz
In directory clnet:/tmp/cvs-serv13555

Modified Files:
	asm-x86.lisp 
Log Message:
Fix disassembly of pc-rel and far-pointer.


--- /project/movitz/cvsroot/movitz/asm-x86.lisp	2008/02/28 20:33:06	1.36
+++ /project/movitz/cvsroot/movitz/asm-x86.lisp	2008/03/06 19:14:39	1.37
@@ -6,7 +6,7 @@
 ;;;; Author:        Frode Vatvedt Fjeld <frodef at acm.org>
 ;;;; Distribution:  See the accompanying file COPYING.
 ;;;;                
-;;;; $Id: asm-x86.lisp,v 1.36 2008/02/28 20:33:06 ffjeld Exp $
+;;;; $Id: asm-x86.lisp,v 1.37 2008/03/06 19:14:39 ffjeld Exp $
 ;;;;                
 ;;;;------------------------------------------------------------------
 
@@ -941,14 +941,14 @@
 		  (ecase mod
 		    (#b00
 		     (case r/m
-		       (#b110 (code-call (decode-integer code '(uint 16))))
+		       (#b110 (list (code-call (decode-integer code '(uint 16)))))
 		       (t (operands r/m))))
 		    (#b01
 		     (append (operands r/m)
-			     (code-call (decode-integer code '(sint 8)))))
+			     (list (code-call (decode-integer code '(sint 8))))))
 		    (#b10
 		     (append (operands r/m)
-			     (code-call (decode-integer code '(uint 16))))))))
+			     (list (code-call (decode-integer code '(uint 16)))))))))
 	    code)))
 
 (defun decode-reg-modrm-32 (code operand-size)
@@ -1088,12 +1088,12 @@
 		    (assert (= code-size (length code)))
 		    (append extra-prefixes code))))))))))
 
-(defmacro pc-rel (opcode operand type &rest extras)
+(defmacro pc-rel (opcode operand type &optional (mode 'operator-mode) &rest extras)
   `(progn
      (assembler
       (return-when (encode-pc-rel operator legacy-prefixes ,opcode ,operand ',type , at extras)))
      (disassembler
-      (define-disassembler (operator ,opcode operator-mode)
+      (define-disassembler (operator ,opcode ,mode)
 	  decode-pc-rel
 	',type))))
 
@@ -1313,7 +1313,7 @@
 				:imm ',op-imm)
 	      ',type)))))
 
-(defmacro far-pointer (opcode segment offset offset-type &rest extra)
+(defmacro far-pointer (opcode segment offset offset-type &optional mode &rest extra)
   `(progn
      (assembler
       (when (and (immediate-p ,segment)
@@ -1327,7 +1327,7 @@
 								    (encode-integer segment '(uint 16)))
 						 , at extra)))))))
      (disassembler
-      (define-disassembler (operator ,opcode operator-mode)
+      (define-disassembler (operator ,opcode ,(or mode 'operator-mode))
 	  decode-far-pointer
 	',offset-type))))
 
@@ -1728,9 +1728,9 @@
     (when (or (and (eq *cpu-mode* :32-bit)
 		   *use-jcc-16-bit-p*)
 	      (eq *cpu-mode* :16-bit))
-      (pc-rel ,opcode2 dst (sint 16)
+      (pc-rel ,opcode2 dst (sint 16) nil
 	      :operand-size :16-bit))
-    (pc-rel ,opcode2 dst (sint 32)
+    (pc-rel ,opcode2 dst (sint 32) nil
 	    :operand-size (case *cpu-mode*
 			    ((:16-bit :32-bit)
 			     :32-bit)))))
@@ -1768,7 +1768,7 @@
 (define-jcc :jz #x74)
 
 (define-operator* (:16 :jcxz :32 :jecxz :64 :jrcxz) (dst)
-  (pc-rel #xe3 dst (sint 8)
+  (pc-rel #xe3 dst (sint 8) nil
 	  :operand-size operator-mode
 	  :rex default-rex))
   
@@ -1778,16 +1778,16 @@
   (cond
     (dst
      (when (eq *cpu-mode* :16-bit)
-       (far-pointer #xea seg-dst dst (uint 16)))
+       (far-pointer #xea seg-dst dst (uint 16) :16-bit))
      (when (eq *cpu-mode* :32-bit)
-       (far-pointer #xea seg-dst dst (xint 32))))
+       (far-pointer #xea seg-dst dst (xint 32) :32-bit)))
     (t (let ((dst seg-dst))
 	 (pc-rel #xeb dst (sint 8))
 	 (when (or (and (eq *cpu-mode* :32-bit)
 			*use-jcc-16-bit-p*)
 		   (eq *cpu-mode* :16-bit))
-	   (pc-rel #xe9 dst (sint 16)))
-	 (pc-rel #xe9 dst (sint 32))
+	   (pc-rel #xe9 dst (sint 16) :16-bit))
+	 (pc-rel #xe9 dst (sint 32) :32-bit)
 	 (when (or (not *position-independent-p*)
 		   (indirect-operand-p dst))
 	   (let ((operator-mode :32-bit))




More information about the Movitz-cvs mailing list