Implemented dynamic array indices
This commit is contained in:
@ -3,6 +3,7 @@ package asm
|
||||
import (
|
||||
"encoding/binary"
|
||||
"fmt"
|
||||
"math"
|
||||
"slices"
|
||||
"strings"
|
||||
|
||||
@ -287,9 +288,17 @@ func (a Assembler) Finalize(dlls dll.List) ([]byte, []byte) {
|
||||
case STORE:
|
||||
switch operands := x.Data.(type) {
|
||||
case *MemoryNumber:
|
||||
code = x64.StoreNumber(code, operands.Address.Base, operands.Address.Offset, operands.Address.Length, operands.Number)
|
||||
if operands.Address.OffsetRegister == math.MaxUint8 {
|
||||
code = x64.StoreNumber(code, operands.Address.Base, operands.Address.Offset, operands.Address.Length, operands.Number)
|
||||
} else {
|
||||
code = x64.StoreDynamicOffsetNumber(code, operands.Address.Base, operands.Address.OffsetRegister, operands.Address.Length, operands.Number)
|
||||
}
|
||||
case *MemoryRegister:
|
||||
code = x64.StoreRegister(code, operands.Address.Base, operands.Address.Offset, operands.Address.Length, operands.Register)
|
||||
if operands.Address.OffsetRegister == math.MaxUint8 {
|
||||
code = x64.StoreRegister(code, operands.Address.Base, operands.Address.Offset, operands.Address.Length, operands.Register)
|
||||
} else {
|
||||
code = x64.StoreDynamicOffsetRegister(code, operands.Address.Base, operands.Address.OffsetRegister, operands.Address.Length, operands.Register)
|
||||
}
|
||||
}
|
||||
|
||||
case SYSCALL:
|
||||
|
@ -3,7 +3,8 @@ package asm
|
||||
import "git.akyoto.dev/cli/q/src/cpu"
|
||||
|
||||
type Memory struct {
|
||||
Base cpu.Register
|
||||
Offset byte
|
||||
Length byte
|
||||
Base cpu.Register
|
||||
Offset byte
|
||||
OffsetRegister cpu.Register
|
||||
Length byte
|
||||
}
|
||||
|
@ -12,7 +12,7 @@ type MemoryNumber struct {
|
||||
|
||||
// String returns a human readable version.
|
||||
func (data *MemoryNumber) String() string {
|
||||
return fmt.Sprintf("%dB [%s+%d], %d", data.Address.Length, data.Address.Base, data.Address.Offset, data.Number)
|
||||
return fmt.Sprintf("%dB [%s+%s+%d], %d", data.Address.Length, data.Address.Base, data.Address.OffsetRegister, data.Address.Offset, data.Number)
|
||||
}
|
||||
|
||||
// MemoryNumber adds an instruction with a memory address and a number.
|
||||
|
@ -14,7 +14,7 @@ type MemoryRegister struct {
|
||||
|
||||
// String returns a human readable version.
|
||||
func (data *MemoryRegister) String() string {
|
||||
return fmt.Sprintf("%dB [%s+%d], %s", data.Address.Length, data.Address.Base, data.Address.Offset, data.Register)
|
||||
return fmt.Sprintf("%dB [%s+%s+%d], %s", data.Address.Length, data.Address.Base, data.Address.OffsetRegister, data.Address.Offset, data.Register)
|
||||
}
|
||||
|
||||
// MemoryRegister adds an instruction with a memory address and a number.
|
||||
|
Reference in New Issue
Block a user