Implemented dynamic array indices

This commit is contained in:
2025-01-24 22:47:28 +01:00
parent c0b30e9c22
commit 6dad6fb6a6
10 changed files with 393 additions and 21 deletions

View File

@ -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:

View File

@ -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
}

View File

@ -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.

View File

@ -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.