changeset 179:75aca5f87969

A bunch of fixes in x86 instruction encoding
author Mike Pavone <pavone@retrodev.com>
date Sat, 24 Aug 2013 09:56:29 -0700
parents e823e104b845
children 270d31c6c4cd
files modules/x86.tp
diffstat 1 files changed, 20 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/modules/x86.tp	Sat Aug 24 09:55:54 2013 -0700
+++ b/modules/x86.tp	Sat Aug 24 09:56:29 2013 -0700
@@ -1,8 +1,11 @@
 {
+	regnames <- #["rax" "rcx" "rdx" "rbx" "rsp" "rbp" "rsi" "rdi" "r8" "r9" "r10" "r11" "r12" "r13" "r14" "r15"]
+	uppernames <- #["ah" "ch" "dh" "bh"]
 	ireg <- :regnum {
 		#{
 			num <- { regnum }
 			reg <- { regnum and 7u8}
+			string <- { regnames get: regnum }
 			rm <- :tail { reg or 0xC0u8 | tail }
 			validforSize? <- :size { true }
 			isInteger? <- { false }
@@ -33,6 +36,7 @@
 		#{
 			num <- { regnum }
 			reg <- { regnum }
+			string <- { uppernames get: regnum - 4 }
 			rm <- :tail { regnum or 0xC0u8 | tail }
 			validforSize? <- :size {
 				size = byte
@@ -88,18 +92,19 @@
 		if: size = byte {
 			opcode
 		} else: {
-			opcode or 2u8
+			opcode or 1u8
 		}
 	}
 	opex <- :val {
 		#{
 			reg <- { val }
+			string <- { "opex " . val}
 		}
 	}
 
 	mod_rm:withTail <- :register regmem :end {
 		l <- regmem rm: end
-		(l value) or (register reg) | (l tail)
+		(l value) or ( lshift: (register reg) by: 3u8) | (l tail)
 	}
 
 	mod_rm <- :reg rm {
@@ -108,10 +113,10 @@
 
 	int_op:withTail <- :value size :tail {
 		if: size >= dword {
-			tail <- (uint8: (value rshift: 16)) | (uint8: (value rshift: 24)) | tail
+			tail <- (uint8: (rshift: value by: 16u64)) | (uint8: (rshift: value by: 24u64)) | tail
 		}
 		if: size >= word {
-			tail <- (uint8: (value rshift: 8)) | tail
+			tail <- (uint8: (rshift: value by: 8u64)) | tail
 		}
 		(uint8: value) | tail
 	}
@@ -122,7 +127,7 @@
 	int_op64 <- :value size {
 		tail <- []
 		if: size = qword {
-			tail <- (uint8: (value rshift: 32)) | (uint8: (value rshift: 40)) | (uint8: (value rshift: 48)) | (uint8: (value rshift: 56)) | tail
+			tail <- (uint8: (rshift: value by: 32u64)) | (uint8: (rshift: value by: 40u64)) | (uint8: (rshift: value by: 48u64)) | (uint8: (rshift: value by: 56u64)) | tail
 		}
 		int_op: value size withTail: tail
 	}
@@ -183,7 +188,7 @@
 		if: (src isInteger?) {
 			reg <- fakesrc
 			base <- if: size > byte && (((src signed?) && src < 128 && src >= -128) || ((not: (src signed?)) && src < 256)) {
-				0x83u8 | (mod_rm: (opex: myopex) dst withTail: [(uint8: src)])
+				byteExt | (mod_rm: (opex: myopex) dst withTail: [(uint8: src)])
 			} else: {
 				if: dst = _rax {
 					(size_bit: immedRax size) | (int_op: src size)
@@ -259,6 +264,15 @@
 			print: "\n"
 			print: ((add: rcx rdx d) map: :el { hex: el })
 			print: "\n"
+			prog <- #[
+				mov: rdi rax q
+				sub: 1 rdi q
+				add: rdi rax q
+				ret:
+			]
+			ba <- bytearray executableFromBytes: prog
+			res <- ba runWithArg: 24u64
+			print: (string: res) . "\n"
 			0
 		}
 	}