rework flags in opcode table
This commit is contained in:
@@ -230,11 +230,11 @@ entries are as follows:
|
|||||||
16 bytes
|
16 bytes
|
||||||
+------------------------------+
|
+------------------------------+
|
||||||
| 0 operand operators |
|
| 0 operand operators |
|
||||||
+------------------------------+
|
+---------+--------------------+
|
||||||
| 127 96 |
|
| 127 120 | 119 96 |
|
||||||
+------------------------------+
|
+---------+--------------------+
|
||||||
| reserved |
|
| flags | reserved |
|
||||||
+------------------------------+
|
+---------+--------------------+
|
||||||
| 95 64 |
|
| 95 64 |
|
||||||
+------------------------------+
|
+------------------------------+
|
||||||
| reserved |
|
| reserved |
|
||||||
@@ -249,39 +249,39 @@ entries are as follows:
|
|||||||
+----------+--------+----------+
|
+----------+--------+----------+
|
||||||
|
|
||||||
16 bytes
|
16 bytes
|
||||||
+-------------------------------------------------------------+
|
+------------------------------------------+
|
||||||
| 1 operand operators |
|
| 1 operand operators |
|
||||||
+-------------------------------------------------------------+
|
+----------+----------+----------+---------+
|
||||||
| 127 96 |
|
| 127 120 | 119 112 | 111 104 | 103 96 |
|
||||||
+-------------------------------------------------------------+
|
+----------+----------+----------+---------+
|
||||||
| reserved |
|
| flags | reserved | flags5 | flags4 |
|
||||||
+----------+-------+-------+-------+-------+----------+-------+
|
+----------+----------+----------+---------+
|
||||||
| 95 88 | 87 84 | 83 80 | 79 76 | 75 72 | 71 68 | 67 64 |
|
| 95 88 | 87 80 | 79 72 | 71 64 |
|
||||||
+----------+-------+-------+-------+-------+----------+-------+
|
+----------+----------+----------+---------+
|
||||||
| reserved | op5&8 | op4&8 | op3&8 | op2&8 | reserved | op0&8 |
|
| flags3 | flags2 | reserved | flags0 |
|
||||||
+----------+-------+-------+-------+-------+----------+-------+
|
+----------+----------+----------+---------+
|
||||||
| 63 56 | 55 48 | 47 40 | 39 32 |
|
| 63 56 | 55 48 | 47 40 | 39 32 |
|
||||||
+----------+---------------+---------------+------------------+
|
+----------+----------+----------+---------+
|
||||||
| opcode | opcode | opcode | opcode |
|
| opcode | opcode | opcode | opcode |
|
||||||
| dst=rel8 | dst=rel | dst=imm8 | dst=imm |
|
| dst=rel8 | dst=rel | dst=imm8 | dst=imm |
|
||||||
+----------+---------------+---------------+------------------+
|
+----------+----------+----------+---------+
|
||||||
| 31 24 | 23 16 | 15 0 |
|
| 31 24 | 23 16 | 15 0 |
|
||||||
+----------+---------------+----------------------------------+
|
+----------+----------+--------------------+
|
||||||
| reserved | opcode | token ID |
|
| reserved | opcode | token ID |
|
||||||
| | dst=r/m | |
|
| | dst=r/m | |
|
||||||
+----------+---------------+----------------------------------+
|
+----------+----------+--------------------+
|
||||||
|
|
||||||
16 bytes
|
16 bytes
|
||||||
+-----------------------------------------------+
|
+-----------------------------------------------+
|
||||||
| 2 operand operators |
|
| 2 operand operators |
|
||||||
+-----------------------------------------------+
|
+---------+-------------------------------------+
|
||||||
| 127 96 |
|
| 127 120 | 119 96 |
|
||||||
+-----------------------------------------------+
|
+---------+-------------------------------------+
|
||||||
| reserved |
|
| flags | reserved |
|
||||||
+---------+----------+-------+-------+----------+
|
+---------+----------+--------------------------+
|
||||||
| 95 88 | 87 80 | 79 76 | 75 72 | 71 64 |
|
| 95 88 | 87 80 | 79 64 |
|
||||||
+---------+----------+-------+-------+----------+
|
+---------+----------+--------------------------+
|
||||||
| flags | reserved | op3&8 | op2&8 | reserved |
|
| flags3 | flags2 | reserved |
|
||||||
+---------+----------+-------+-------+----------+
|
+---------+----------+-------+-------+----------+
|
||||||
| 63 48 | 47 40 | 39 32 |
|
| 63 48 | 47 40 | 39 32 |
|
||||||
+--------------------+---------------+----------+
|
+--------------------+---------------+----------+
|
||||||
@@ -305,9 +305,23 @@ entries are as follows:
|
|||||||
| reserved | 8bit |
|
| reserved | 8bit |
|
||||||
+----------+------+
|
+----------+------+
|
||||||
|
|
||||||
|
1 byte
|
||||||
|
+----------------------------------------------------+
|
||||||
|
| flagsX byte |
|
||||||
|
+----------+-----------+-------------+---------------+
|
||||||
|
| 7 5 | 4 | 3 | 2 0 |
|
||||||
|
+----------+-----------+-------------+---------------+
|
||||||
|
| reserved | no ModR/M | 0x0F prefix | operator flag |
|
||||||
|
+----------+-----------+-------------+---------------+
|
||||||
|
|
||||||
; flags key:
|
; flags key:
|
||||||
8bit ; tte has opcodes for r/m8 and r8 instead of r/m and r respectively
|
8bit ; tte has opcodes for r/m8 and r8 instead of r/m and r respectively
|
||||||
|
|
||||||
|
; flagsX key:
|
||||||
|
no ModR/M ; there is no ModR/M byte for this opcode
|
||||||
|
0x0F prefix ; there is a 0x0F prefix for this opcode
|
||||||
|
operator flag ; contents of `reg` if applicable
|
||||||
|
|
||||||
; key:
|
; key:
|
||||||
r/m ; r/m 16/32/64
|
r/m ; r/m 16/32/64
|
||||||
r/m8 ; r/m 8
|
r/m8 ; r/m 8
|
||||||
@@ -317,10 +331,6 @@ imm ; imm 16/32
|
|||||||
imm8 ; imm 8
|
imm8 ; imm 8
|
||||||
rel ; rel 16/32
|
rel ; rel 16/32
|
||||||
rel8 ; rel 8
|
rel8 ; rel 8
|
||||||
|
|
||||||
opX&8 ; low 8 bits are the operator flag that goes with opcode at offset X from
|
|
||||||
; the first opcode in the table entry. High bit is (somewhat confusingly)
|
|
||||||
; a flag for whether or not the operator comes with an `0F` prefix
|
|
||||||
```
|
```
|
||||||
|
|
||||||
note much room to expand. If an opcode doesn't exist, it should be 0x00
|
note much room to expand. If an opcode doesn't exist, it should be 0x00
|
||||||
|
|||||||
@@ -1083,9 +1083,7 @@ get_ModRM:
|
|||||||
;
|
;
|
||||||
; returned:
|
; returned:
|
||||||
; al = opcode; the rest of rax is zeroed.
|
; al = opcode; the rest of rax is zeroed.
|
||||||
; dl = lower 3 bits: op flag, if applicable.
|
; dl = flags
|
||||||
; 4th bit: 0x0F prefix flag
|
|
||||||
; the rest of rdx is zeroed.
|
|
||||||
; ------------------------------------------------------------------------------
|
; ------------------------------------------------------------------------------
|
||||||
|
|
||||||
get_opcode:
|
get_opcode:
|
||||||
@@ -1114,7 +1112,7 @@ get_opcode:
|
|||||||
|
|
||||||
.maybe_found:
|
.maybe_found:
|
||||||
shl eax, 4
|
shl eax, 4
|
||||||
mov cl, [opcodes.by_id + 11 + eax]
|
mov cl, [opcodes.by_id + 15 + eax]
|
||||||
shr eax, 4
|
shr eax, 4
|
||||||
cmp cl, bl
|
cmp cl, bl
|
||||||
je .found
|
je .found
|
||||||
@@ -1127,18 +1125,9 @@ get_opcode:
|
|||||||
ret
|
ret
|
||||||
.found:
|
.found:
|
||||||
shl eax, 4
|
shl eax, 4
|
||||||
push rsi
|
|
||||||
shr esi, 1
|
|
||||||
mov dl, [esi + 8 + opcodes.by_id + eax]
|
mov dl, [esi + 8 + opcodes.by_id + eax]
|
||||||
pop rsi
|
|
||||||
|
|
||||||
test esi, 1 ; check if offset is odd
|
|
||||||
jz .found_continue
|
|
||||||
shr edx, 4 ; if so, upper part of dl byte
|
|
||||||
.found_continue:
|
|
||||||
mov al, [esi + 2 + opcodes.by_id + eax]
|
mov al, [esi + 2 + opcodes.by_id + eax]
|
||||||
and eax, 0xFF
|
and eax, 0xFF
|
||||||
and edx, 0x0F
|
|
||||||
ret
|
ret
|
||||||
|
|
||||||
; ------------------------------------------------------------------------------
|
; ------------------------------------------------------------------------------
|
||||||
@@ -2800,23 +2789,18 @@ opcodes:
|
|||||||
db 0x83 ; r/m <- imm8
|
db 0x83 ; r/m <- imm8
|
||||||
dw 0x0000
|
dw 0x0000
|
||||||
|
|
||||||
dd 0x00006600 ; 00:
|
dw 0x0000
|
||||||
; 6: r/m <- imm16/32 op flag
|
db 0x06 ; 6: r/m <- imm16/32 op flag
|
||||||
; 6: r/m <- imm8 op flag
|
db 0x06 ; 6: r/m <- imm8 op flag
|
||||||
; 0x0000:
|
|
||||||
|
|
||||||
dd 0x00000000 ; reserved
|
dd 0x00000000
|
||||||
|
|
||||||
; inc
|
; inc
|
||||||
dw 0x0054
|
dw 0x0054
|
||||||
db 0xFF ; r/m
|
db 0xFF ; r/m
|
||||||
db 0x00
|
db 0x00
|
||||||
|
|
||||||
dd 0x00000000
|
dd 0x00000000
|
||||||
|
dd 0x00000000
|
||||||
dd 0x00000000 ; 0: r/m op flag
|
|
||||||
; 0000000:
|
|
||||||
|
|
||||||
dd 0x00000000
|
dd 0x00000000
|
||||||
|
|
||||||
; dec
|
; dec
|
||||||
@@ -2826,8 +2810,10 @@ opcodes:
|
|||||||
|
|
||||||
dd 0x00000000
|
dd 0x00000000
|
||||||
|
|
||||||
dd 0x00000001 ; 1: r/m op flag
|
db 0x01 ; r/m op byte
|
||||||
; 0000000:
|
db 0x00
|
||||||
|
dw 0x0000
|
||||||
|
|
||||||
dd 0x00000000
|
dd 0x00000000
|
||||||
|
|
||||||
; mov
|
; mov
|
||||||
@@ -2839,10 +2825,7 @@ opcodes:
|
|||||||
db 0x00
|
db 0x00
|
||||||
dw 0x0000
|
dw 0x0000
|
||||||
|
|
||||||
dd 0x00000000 ; 00:
|
dd 0x00000000
|
||||||
; 0: r/m <- imm16/32 op flag
|
|
||||||
; 00000:
|
|
||||||
|
|
||||||
dd 0x00000000
|
dd 0x00000000
|
||||||
|
|
||||||
; mov bit8
|
; mov bit8
|
||||||
@@ -2854,13 +2837,12 @@ opcodes:
|
|||||||
db 0xC6 ; r/m8 <- imm8
|
db 0xC6 ; r/m8 <- imm8
|
||||||
dw 0x0000
|
dw 0x0000
|
||||||
|
|
||||||
dd 0x01000000 ; 000:
|
|
||||||
; 0: r/m8 <- imm8 op flag
|
|
||||||
; 00:
|
|
||||||
; 01: bit8 flag
|
|
||||||
|
|
||||||
dd 0x00000000
|
dd 0x00000000
|
||||||
|
|
||||||
|
dw 0x0000
|
||||||
|
db 0x00
|
||||||
|
db 0x01 ; bit8 flag
|
||||||
|
|
||||||
; add
|
; add
|
||||||
dw 0x0057
|
dw 0x0057
|
||||||
db 0x01 ; r/m <- r
|
db 0x01 ; r/m <- r
|
||||||
@@ -2870,11 +2852,7 @@ opcodes:
|
|||||||
db 0x83 ; r/m <- imm8
|
db 0x83 ; r/m <- imm8
|
||||||
dw 0x0000
|
dw 0x0000
|
||||||
|
|
||||||
dd 0x00000000 ; 00:
|
dd 0x00000000
|
||||||
; 0: r/m <- imm16/32 op flag
|
|
||||||
; 0: r/m <- imm8 op flag
|
|
||||||
; 0000:
|
|
||||||
|
|
||||||
dd 0x00000000
|
dd 0x00000000
|
||||||
|
|
||||||
; sub
|
; sub
|
||||||
@@ -2886,10 +2864,9 @@ opcodes:
|
|||||||
db 0x83 ; r/m <- imm8
|
db 0x83 ; r/m <- imm8
|
||||||
dw 0x0000
|
dw 0x0000
|
||||||
|
|
||||||
dd 0x00005500 ; 00:
|
dw 0x0000
|
||||||
; 5: r/m <- imm16/32 op flag
|
db 0x05 ; 5: r/m <- imm16/32 op flag
|
||||||
; 5: r/m <- imm8 op flag
|
db 0x05 ; 5: r/m <- imm8 op flag
|
||||||
; 0000:
|
|
||||||
|
|
||||||
dd 0x00000000
|
dd 0x00000000
|
||||||
|
|
||||||
@@ -2902,8 +2879,9 @@ opcodes:
|
|||||||
db 0xE8 ; rel16/32
|
db 0xE8 ; rel16/32
|
||||||
db 0x00
|
db 0x00
|
||||||
|
|
||||||
dd 0x00000002 ; 2: r/m op flag
|
db 0x02 ; 2: r/m op flag
|
||||||
; 0000000:
|
db 0x00
|
||||||
|
dw 0x0000
|
||||||
|
|
||||||
dd 0x00000000
|
dd 0x00000000
|
||||||
|
|
||||||
@@ -2924,10 +2902,9 @@ opcodes:
|
|||||||
db 0x83 ; r/m <- imm8
|
db 0x83 ; r/m <- imm8
|
||||||
dw 0x0000
|
dw 0x0000
|
||||||
|
|
||||||
dd 0x00007700 ; 00:
|
dw 0x0000
|
||||||
; 7: r/m <- imm16/32 op flag
|
db 0x07 ; 7: r/m <- imm16/32 op flag
|
||||||
; 7: r/m <- imm8 op flag
|
db 0x07 ; 7: r/m <- imm8 op flag
|
||||||
; 0000:
|
|
||||||
|
|
||||||
dd 0x00000000
|
dd 0x00000000
|
||||||
|
|
||||||
@@ -2940,27 +2917,26 @@ opcodes:
|
|||||||
db 0x80 ; r/m8 <- imm8
|
db 0x80 ; r/m8 <- imm8
|
||||||
dw 0x0000
|
dw 0x0000
|
||||||
|
|
||||||
dd 0x01007000 ; 000:
|
dw 0x0000
|
||||||
; 7: r/m8 <- imm8 op flag
|
db 0x00
|
||||||
; 00:
|
db 0x07 ; 7: r/m8 <- imm8 op flag
|
||||||
; 01: bit8 flag
|
|
||||||
|
|
||||||
dd 0x00000000
|
dw 0x0000
|
||||||
|
db 0x00
|
||||||
|
db 0x01 ; bit8 flag
|
||||||
|
|
||||||
; jmp
|
; jmp
|
||||||
dw 0x005C
|
dw 0x005C
|
||||||
db 0xFF ; r/m
|
db 0xFF ; r/m
|
||||||
db 0x00
|
db 0x00
|
||||||
|
|
||||||
dw 0x0000
|
dw 0x0000
|
||||||
db 0xE9 ; rel16/32
|
db 0xE9 ; rel16/32
|
||||||
db 0xEB ; rel8
|
db 0xEB ; rel8
|
||||||
|
|
||||||
dd 0x00000004 ; 4: r/m
|
db 0x04 ; r/m
|
||||||
; 000:
|
db 0x00
|
||||||
; 0: rel16/32
|
dw 0x0000
|
||||||
; 0: rel8
|
|
||||||
; 00:
|
|
||||||
|
|
||||||
dd 0x00000000
|
dd 0x00000000
|
||||||
|
|
||||||
@@ -2972,26 +2948,26 @@ opcodes:
|
|||||||
db 0x84 ; rel16/32
|
db 0x84 ; rel16/32
|
||||||
db 0x74 ; rel8
|
db 0x74 ; rel8
|
||||||
|
|
||||||
dd 0x00080000 ; 0000:
|
|
||||||
; 8: rel16/32 0x0F flag
|
|
||||||
; 000:
|
|
||||||
|
|
||||||
dd 0x00000000
|
dd 0x00000000
|
||||||
|
|
||||||
|
db 0x08 ; 8: rel16/32 0x0F flag
|
||||||
|
db 0x00
|
||||||
|
dw 0x0000
|
||||||
|
|
||||||
; jne
|
; jne
|
||||||
dw 0x005E
|
dw 0x005E
|
||||||
dw 0x0000
|
dw 0x0000
|
||||||
|
|
||||||
dw 0x0000
|
dw 0x0000
|
||||||
db 0x00 ; TODO figure out the 0x0F prefix this will need
|
db 0x85 ; rel16/32
|
||||||
db 0x75 ; rel8
|
db 0x75 ; rel8
|
||||||
|
|
||||||
dd 0x00000000 ; 00000:
|
|
||||||
; 0: rel8
|
|
||||||
; 00:
|
|
||||||
|
|
||||||
dd 0x00000000
|
dd 0x00000000
|
||||||
|
|
||||||
|
db 0x08 ; 8: rel16/32 0x0F flag
|
||||||
|
db 0x00
|
||||||
|
dw 0x0000
|
||||||
|
|
||||||
; push
|
; push
|
||||||
; TODO add support for the +r variation
|
; TODO add support for the +r variation
|
||||||
dw 0x005F
|
dw 0x005F
|
||||||
@@ -3002,11 +2978,9 @@ opcodes:
|
|||||||
db 0x6A ; imm8
|
db 0x6A ; imm8
|
||||||
dw 0x0000
|
dw 0x0000
|
||||||
|
|
||||||
dd 0x00000006 ; 6: r/m
|
db 0x06 ; 6: r/m
|
||||||
; 0:
|
db 0x00
|
||||||
; 0: imm16/32
|
dw 0x0000
|
||||||
; 0: imm8
|
|
||||||
; 0000:
|
|
||||||
|
|
||||||
dd 0x00000000
|
dd 0x00000000
|
||||||
|
|
||||||
@@ -3015,12 +2989,8 @@ opcodes:
|
|||||||
dw 0x0060
|
dw 0x0060
|
||||||
db 0x8F ; r/m
|
db 0x8F ; r/m
|
||||||
db 0x00
|
db 0x00
|
||||||
|
|
||||||
dd 0x00000000
|
dd 0x00000000
|
||||||
|
dd 0x00000000
|
||||||
dd 0x00000000 ; 0: r/m
|
|
||||||
; 0000000:
|
|
||||||
|
|
||||||
dd 0x00000000
|
dd 0x00000000
|
||||||
|
|
||||||
; out
|
; out
|
||||||
|
|||||||
Reference in New Issue
Block a user