44 lines
913 B
Go
44 lines
913 B
Go
package x64
|
|
|
|
// numRegReg encodes an instruction with up to two registers and a number parameter.
|
|
func numRegReg(code []byte, opCode8 byte, opCode32 byte, reg byte, rm byte, number int) []byte {
|
|
w := byte(1) // Indicates a 64-bit register.
|
|
r := byte(0) // Extension to the "reg" field in ModRM.
|
|
x := byte(0) // Extension to the SIB index field.
|
|
b := byte(0) // Extension to the "rm" field in ModRM or the SIB base (r8 up to r15 use this).
|
|
mod := byte(0b11) // Direct addressing mode, no register offsets.
|
|
|
|
if reg > 0b111 {
|
|
r = 1
|
|
reg &= 0b111
|
|
}
|
|
|
|
if rm > 0b111 {
|
|
b = 1
|
|
rm &= 0b111
|
|
}
|
|
|
|
rex := REX(w, r, x, b)
|
|
modRM := ModRM(mod, reg, rm)
|
|
|
|
if sizeOf(number) == 1 {
|
|
return append(
|
|
code,
|
|
rex,
|
|
opCode8,
|
|
modRM,
|
|
byte(number),
|
|
)
|
|
}
|
|
|
|
return append(
|
|
code,
|
|
rex,
|
|
opCode32,
|
|
modRM,
|
|
byte(number),
|
|
byte(number>>8),
|
|
byte(number>>16),
|
|
byte(number>>24),
|
|
)
|
|
}
|