Implemented simple expressions

This commit is contained in:
Eduard Urbach 2024-06-25 20:50:06 +02:00
parent c437b1d0f8
commit 37e222e022
Signed by: eduard
GPG key ID: 49226B848C78F6C8
12 changed files with 232 additions and 52 deletions

View file

@ -6,5 +6,37 @@ import (
// AddRegNum adds a number to the given register.
func AddRegNum(code []byte, destination cpu.Register, number int) []byte {
return numRegReg(code, 0x83, 0x81, 0, byte(destination), number)
return numRegReg(code, 0, byte(destination), number, 0x83, 0x81)
}
// AddRegReg adds a number to the given register.
func AddRegReg(code []byte, destination cpu.Register, operand cpu.Register) []byte {
return regReg(code, byte(operand), byte(destination), 0x01)
}
func regReg(code []byte, reg byte, rm byte, opCodes ...byte) []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)
code = append(code, rex)
code = append(code, opCodes...)
code = append(code, modRM)
return code
}