start to implement operand types and checks

This commit is contained in:
Michael McLoughlin
2018-11-26 22:14:36 -08:00
parent bed7e7e2c2
commit 3050882621
4 changed files with 180 additions and 16 deletions

34
operand/types.go Normal file
View File

@@ -0,0 +1,34 @@
package operand
import (
"fmt"
"github.com/mmcloughlin/avo/reg"
)
type Mem struct {
Disp int
Base reg.Register
Index reg.Register
Scale uint8
}
func (m Mem) Asm() string {
a := ""
if m.Disp != 0 {
a += fmt.Sprintf("%d", m.Disp)
}
if m.Base != nil {
a += fmt.Sprintf("(%s)", m.Base.Asm())
}
if m.Index != nil && m.Scale != 0 {
a += fmt.Sprintf("(%s*%d)", m.Index.Asm(), m.Scale)
}
return a
}
type Imm uint64
func (i Imm) Asm() string {
return fmt.Sprintf("%#x", uint64(i))
}