96 lines
3.8 KiB
Plaintext
96 lines
3.8 KiB
Plaintext
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.
|