[movitz-cvs] CVS movitz
ffjeld
ffjeld at common-lisp.net
Sat Feb 16 21:58:57 UTC 2008
Update of /project/movitz/cvsroot/movitz
In directory clnet:/tmp/cvs-serv10437
Modified Files:
asm-x86.lisp
Log Message:
Improved disassembly for opcode operands (i.e. push/pop segment registers).
--- /project/movitz/cvsroot/movitz/asm-x86.lisp 2008/02/16 21:43:59 1.24
+++ /project/movitz/cvsroot/movitz/asm-x86.lisp 2008/02/16 21:58:57 1.25
@@ -6,7 +6,7 @@
;;;; Author: Frode Vatvedt Fjeld <frodef at acm.org>
;;;; Distribution: See the accompanying file COPYING.
;;;;
-;;;; $Id: asm-x86.lisp,v 1.24 2008/02/16 21:43:59 ffjeld Exp $
+;;;; $Id: asm-x86.lisp,v 1.25 2008/02/16 21:58:57 ffjeld Exp $
;;;;
;;;;------------------------------------------------------------------
@@ -399,37 +399,25 @@
`(define-operator ,operator :8-bit ,lambda-list
(let ((default-rex nil))
(declare (ignorable default-rex))
- (macrolet ((yield (&rest args)
- `(return-from operator
- (encode (encoded-values :operand-size operator-mode , at args)))))
- , at body))))
+ , at body)))
(defmacro define-operator/16 (operator lambda-list &body body)
`(define-operator ,operator :16-bit ,lambda-list
(let ((default-rex nil))
(declare (ignorable default-rex))
- (macrolet ((yield (&rest args)
- `(return-from operator
- (encode (encoded-values :operand-size operator-mode , at args)))))
- , at body))))
+ , at body)))
(defmacro define-operator/32 (operator lambda-list &body body)
`(define-operator ,operator :32-bit ,lambda-list
(let ((default-rex nil))
(declare (ignorable default-rex))
- (macrolet ((yield (&rest args)
- `(return-from operator
- (encode (encoded-values :operand-size operator-mode , at args)))))
- , at body))))
+ , at body)))
(defmacro define-operator/64 (operator lambda-list &body body)
`(define-operator ,operator :64-bit ,lambda-list
(let ((default-rex '(:rex.w)))
(declare (ignorable default-rex))
- (macrolet ((yield (&rest args)
- `(return-from operator
- (encode (encoded-values :operand-size operator-mode , at args)))))
- , at body))))
+ , at body)))
(defmacro define-operator/64* (operator lambda-list &body body)
`(define-operator ,operator :64-bit ,lambda-list
@@ -834,9 +822,10 @@
(1+ (lognot unsigned-integer)))))
code)))
-(defun decode-no-operands (code operator opcode operand-size address-size rex)
+(defun decode-no-operands (code operator opcode operand-size address-size rex &rest fixed-operands)
(declare (ignore opcode operand-size address-size rex))
- (values (list operator)
+ (values (list* operator
+ (remove nil fixed-operands))
code))
(defun decode-reg-modrm (code operator opcode operand-size address-size rex operand-ordering)
@@ -1144,15 +1133,19 @@
:key #'resolve-operand)
',type)))))))
-(defmacro opcode (opcode &rest extras)
+(defmacro opcode (opcode &optional fixed-operand &rest extras)
`(progn
(assembler
- (return-values-when
- (encoded-values :opcode ,opcode
- , at extras
- :operand-size operator-mode)))
+ (when (and ,@(when fixed-operand
+ `((eql , at fixed-operand))))
+ (return-values-when
+ (encoded-values :opcode ,opcode
+ , at extras
+ :operand-size operator-mode))))
(disassembler
- (define-disassembler (operator ,opcode) decode-no-operands))))
+ (define-disassembler (operator ,opcode)
+ decode-no-operands
+ ,(second fixed-operand)))))
(defmacro opcode* (opcode &rest extras)
`(return-values-when
@@ -1635,7 +1628,7 @@
;;;;;;;;;;; IRET
(define-operator* (:16 :iret :32 :iretd :64 :iretq) ()
- (opcode #xcf :rex default-rex))
+ (opcode #xcf () :rex default-rex))
;;;;;;;;;;; Jcc
@@ -1918,12 +1911,11 @@
;;;;;;;;;;; POP
(define-operator* (:16 :popw :32 :popl) (dst)
- (case dst
- (:ds (yield :opcode #x1f))
- (:es (yield :opcode #x07))
- (:ss (yield :opcode #x17))
- (:fs (yield :opcode #x0fa1))
- (:gs (yield :opcode #x0fa9)))
+ (opcode #x1f (dst :ds))
+ (opcode #x07 (dst :es))
+ (opcode #x17 (dst :ss))
+ (opcode #x0fa1 (dst :fs))
+ (opcode #x0fa9 (dst :gs))
(opcode-reg #x58 dst)
(modrm dst #x8f 0))
@@ -1953,13 +1945,12 @@
;;;;;;;;;;; PUSH
(define-operator* (:16 :pushw :32 :pushl) (src)
- (case src
- (:cs (yield :opcode #x0e))
- (:ss (yield :opcode #x16))
- (:ds (yield :opcode #x1e))
- (:es (yield :opcode #x06))
- (:fs (yield :opcode #x0fa0))
- (:gs (yield :opcode #x0fa8)))
+ (opcode #x0e (src :cs))
+ (opcode #x16 (src :ss))
+ (opcode #x1e (src :ds))
+ (opcode #x06 (src :es))
+ (opcode #x0fa0 (src :fs))
+ (opcode #x0fa8 (src :gs))
(opcode-reg #x50 src)
(imm src #x6a (sint 8))
(imm src #x68 :int-16-32-64 () :operand-size operator-mode)
More information about the Movitz-cvs
mailing list