Implemented addition
This commit is contained in:
parent
b6722c5482
commit
0657b88945
6 changed files with 78 additions and 23 deletions
|
@ -27,21 +27,15 @@ func (a *Assembler) Finalize() ([]byte, []byte) {
|
|||
|
||||
for _, x := range a.Instructions {
|
||||
switch x.Mnemonic {
|
||||
case MOVE:
|
||||
case ADD:
|
||||
switch operands := x.Data.(type) {
|
||||
case *RegisterNumber:
|
||||
code = x64.MoveRegNum32(code, operands.Register, uint32(operands.Number))
|
||||
code = x64.AddRegNum8(code, operands.Register, uint8(operands.Number))
|
||||
|
||||
case *RegisterRegister:
|
||||
code = x64.MoveRegReg64(code, operands.Destination, operands.Source)
|
||||
// code = x64.AddRegReg64(code, operands.Destination, operands.Source)
|
||||
}
|
||||
|
||||
case RETURN:
|
||||
code = x64.Return(code)
|
||||
|
||||
case SYSCALL:
|
||||
code = x64.Syscall(code)
|
||||
|
||||
case CALL:
|
||||
code = x64.Call(code, 0x00_00_00_00)
|
||||
size := 4
|
||||
|
@ -77,6 +71,21 @@ func (a *Assembler) Finalize() ([]byte, []byte) {
|
|||
case LABEL:
|
||||
labels[x.Data.(*Label).Name] = Address(len(code))
|
||||
|
||||
case MOVE:
|
||||
switch operands := x.Data.(type) {
|
||||
case *RegisterNumber:
|
||||
code = x64.MoveRegNum32(code, operands.Register, uint32(operands.Number))
|
||||
|
||||
case *RegisterRegister:
|
||||
code = x64.MoveRegReg64(code, operands.Destination, operands.Source)
|
||||
}
|
||||
|
||||
case RETURN:
|
||||
code = x64.Return(code)
|
||||
|
||||
case SYSCALL:
|
||||
code = x64.Syscall(code)
|
||||
|
||||
default:
|
||||
panic("Unknown mnemonic: " + x.Mnemonic.String())
|
||||
}
|
||||
|
|
|
@ -2,6 +2,17 @@ package asm
|
|||
|
||||
import "git.akyoto.dev/cli/q/src/build/cpu"
|
||||
|
||||
// AddRegisterNumber adds a number to the given register.
|
||||
func (a *Assembler) AddRegisterNumber(reg cpu.Register, number uint64) {
|
||||
a.Instructions = append(a.Instructions, Instruction{
|
||||
Mnemonic: ADD,
|
||||
Data: &RegisterNumber{
|
||||
Register: reg,
|
||||
Number: number,
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
// MoveRegisterNumber moves a number into the given register.
|
||||
func (a *Assembler) MoveRegisterNumber(reg cpu.Register, number uint64) {
|
||||
a.Instructions = append(a.Instructions, Instruction{
|
||||
|
|
|
@ -4,17 +4,30 @@ type Mnemonic uint8
|
|||
|
||||
const (
|
||||
NONE Mnemonic = iota
|
||||
ADD
|
||||
CALL
|
||||
JUMP
|
||||
LABEL
|
||||
MOVE
|
||||
RETURN
|
||||
SYSCALL
|
||||
LABEL
|
||||
CALL
|
||||
JUMP
|
||||
)
|
||||
|
||||
// String returns a human readable version.
|
||||
func (m Mnemonic) String() string {
|
||||
switch m {
|
||||
case ADD:
|
||||
return "add"
|
||||
|
||||
case CALL:
|
||||
return "call"
|
||||
|
||||
case JUMP:
|
||||
return "jump"
|
||||
|
||||
case LABEL:
|
||||
return "label"
|
||||
|
||||
case MOVE:
|
||||
return "move"
|
||||
|
||||
|
@ -23,15 +36,6 @@ func (m Mnemonic) String() string {
|
|||
|
||||
case SYSCALL:
|
||||
return "syscall"
|
||||
|
||||
case LABEL:
|
||||
return "label"
|
||||
|
||||
case CALL:
|
||||
return "call"
|
||||
|
||||
case JUMP:
|
||||
return "jump"
|
||||
}
|
||||
|
||||
return "NONE"
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue