-
Notifications
You must be signed in to change notification settings - Fork 10
/
encoding.txt
95 lines (79 loc) · 3.85 KB
/
encoding.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
x86prime instructions and encoding
----------------------------------
Encoding: Assembler Operation
00000000 00000000 stop stop the machine
00000001 0000ssss ret s return from function call
0001aaaa ddddssss op s,d reg/reg arithmetic (see below)
00100001 ddddssss movq s,d reg->reg copy
00110001 ddddssss movq (s),d load (memory -> reg copy)
00111001 ddddssss movq d,(s) store (reg -> memory copy)
-
0100cccc ddddssss pp...32...pp cb<c> s,d,p compare and continue at p if... (see below)
01001110 dddd0000 pp...32...pp call p,d function call
01001111 00000000 pp...32...pp jmp p continue at p
0101aaaa dddd0000 ii...32...ii op $i,d constant/reg arithmethic(see below)
01100100 dddd0000 ii...32...ii movq $i,d constant -> register
01110101 ddddssss ii...32...ii movq i(s),d load (memory -> reg copy)
01111101 ddddssss ii...32...ii movq d,i(s) store (reg -> memory copy)
-
10000001 ddddssss leaq (s),d s -> d
10010010 dddd0000 zzzzvvvv leaq (,z,v),d z*v -> d
10010011 ddddssss zzzzvvvv leaq (s,z,v),d s+z*v -> d
10100100 dddd0000 ii...32...ii leaq i,d i -> d
10100101 ddddssss ii...32...ii leaq i(s),d i+s -> d
10110110 dddd0000 zzzzvvvv ii...32...ii leaq i(,z,v),d i+z*v -> d
10110111 ddddssss zzzzvvvv ii...32...ii leaq i(s,z,v),d i+s+z*v -> d
-
1111cccc dddd0000 ii...32...ii pp...32...pp cb<c> $i,d,p compare and continue at p if... (see below)
Note: first 4 bits are called the "major opcode", next 4 bits are called the "minor opcode".
Explanations:
aaaa indicates the kind of arithmetic operation. All operate on full 64 bits:
0000 add addition
0001 sub subtraction
0010 and bitwise and
0011 or bitwise or
0100 xor bitwise xor
0101 mul unsigned multiplication
0110 sar shift arithmetic right (preserve topmost bit)
0111 sal shift arithmetic left (zero into lsb, do not preserve topmost bit)
1000 shr shift (logical) right (zero into topmost bit)
1001 imul signed multiplication
d,s and z are registers:
0000 %rax 1000 %r8
0001 %rbx 1001 %r9
0010 %rcx 1010 %r10
0011 %rdx 1011 %r11
0100 %rbp 1100 %r12
0101 %rsi 1101 %r13
0110 %rdi 1110 %r14
0111 %rsp 1111 %r15
v is a scale factor encoded into the field vvvv in the form of a shift amount as follows:
vvvv v
0000 1
0001 2
0010 4
0011 8
ii...32...ii is a 32 bit signed immediate
pp...32...pp is a 32 bit target address
<c> is a condition mnemonic used in compare-and-branch. The compare-and-branch
instruction cb<c> is not part of the original x86 instruction set, but the
conditions in x86prime carry the same meaning as for x86.
Example: cble %rdi,%rbp,target = if %rdi <= %rbp (signed) then jump to target
Encoding Semantic
0000 e Equal
0001 ne Not equal
0010 <reserved>
0011 <reserved>
0100 l less (signed)
0101 le less or equal (signed)
0110 g greater (signed)
0111 ge greater or equal (signed)
1000 a above (unsigned)
1001 ae above or equal (unsigned)
1010 b below (unsigned)
1011 be below or equal (unsigned)
11xx <reserved>
Note that signed and unsigned comparisons are different.
call places the return address in a register instead of pushing it onto the stack.
ret returns to the address in a register instead of popping it from the stack.
returning to address 0 or to a negative address (bit 64 set) stops the machine.