Implemented register push and pop

This commit is contained in:
Eduard Urbach 2024-06-25 16:19:47 +02:00
parent 3aedcef9eb
commit e9c46bc3cd
Signed by: eduard
GPG key ID: 49226B848C78F6C8
6 changed files with 128 additions and 6 deletions

View file

@ -48,11 +48,23 @@ func (a *Assembler) Finalize() ([]byte, []byte) {
case DIV:
switch operands := x.Data.(type) {
case *RegisterNumber:
code = x64.MoveRegReg64(code, x64.RAX, operands.Register)
code = x64.MoveRegNum32(code, operands.Register, uint32(operands.Number))
code = x64.ExtendRAXToRDX(code)
code = x64.DivReg(code, operands.Register)
code = x64.MoveRegReg64(code, operands.Register, x64.RAX)
if operands.Register == x64.RAX {
code = x64.PushReg(code, x64.RCX)
code = x64.MoveRegNum32(code, x64.RCX, uint32(operands.Number))
code = x64.ExtendRAXToRDX(code)
code = x64.DivReg(code, x64.RCX)
code = x64.PopReg(code, x64.RCX)
} else {
code = x64.PushReg(code, x64.RAX)
code = x64.PushReg(code, x64.RDX)
code = x64.MoveRegReg64(code, x64.RAX, operands.Register)
code = x64.MoveRegNum32(code, operands.Register, uint32(operands.Number))
code = x64.ExtendRAXToRDX(code)
code = x64.DivReg(code, operands.Register)
code = x64.MoveRegReg64(code, operands.Register, x64.RAX)
code = x64.PopReg(code, x64.RDX)
code = x64.PopReg(code, x64.RAX)
}
}
case CALL:

View file

@ -14,5 +14,5 @@ type RegisterNumber struct {
// String returns a human readable version.
func (data *RegisterNumber) String() string {
return fmt.Sprintf("%s, %x", data.Register, data.Number)
return fmt.Sprintf("%s, %Xₕ", data.Register, data.Number)
}