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 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 $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 is a condition mnemonic used in compare-and-branch. The compare-and-branch instruction cb 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 0011 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 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.