ga

package module
v0.0.0-...-8beab68 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 4, 2023 License: BSD-3-Clause Imports: 3 Imported by: 0

README

General Assembly is an abstraction over x86-64 and ARM64 assembly languages. It is intended for writing non-optimal but correct glue code. Go program is used to generate GNU assembler source files.

Documentation

Index

Constants

This section is empty.

Variables

View Source
var AMD64 = &ArchAMD64{
	ClearableRegs: []RegAMD64{
		RAX,
		RCX,
		RDX,
		RBX,

		RBP,
		RSI,
		RDI,
		R8,
		R9,
		R10,
		R11,
		R12,
		R13,
		R14,
		R15,
	},
}
View Source
var ARM64 = &ArchARM64{
	ClearableRegs: []RegARM64{
		X0,
		X1,
		X2,
		X3,
		X4,
		X5,
		X6,
		X7,
		X8,
		X9,
		X10,
		X11,
		X12,
		X13,
		X14,
		X15,
		X16,
		X17,
		X18,
		X19,
		X20,
		X21,
		X22,
		X23,
		X24,
		X25,
		X26,
		X27,
		X28,
		X29,
	},
}
View Source
var Archs = map[string]Arch{
	"amd64": AMD64,
	"arm64": ARM64,
}

Indexed by Go-style CPU architecture name (amd64, arm64).

View Source
var Native = AMD64

Functions

This section is empty.

Types

type Arch

type Arch interface {
	Machine() string      // GNU-style CPU architecture name (x86_64, aarch64).
	Specify(Specific) int // Get value for the CPU architecture.
	// contains filtered or unexported methods
}

Arch itecture of CPU.

type ArchAMD64

type ArchAMD64 struct {
	ClearableRegs []RegAMD64
}

func (*ArchAMD64) ClearReg

func (arch *ArchAMD64) ClearReg(a *Assembly, r RegAMD64)

func (*ArchAMD64) ExchangeMem4BytesReg

func (arch *ArchAMD64) ExchangeMem4BytesReg(a *Assembly, base RegAMD64, offset int, r RegAMD64)

func (*ArchAMD64) Machine

func (*ArchAMD64) Machine() string

func (*ArchAMD64) OrMem4BytesImm

func (arch *ArchAMD64) OrMem4BytesImm(a *Assembly, base RegAMD64, offset, value int)

func (*ArchAMD64) Specify

func (*ArchAMD64) Specify(x Specific) int

type ArchARM64

type ArchARM64 struct {
	ClearableRegs []RegARM64
}

func (*ArchARM64) ClearReg

func (arch *ArchARM64) ClearReg(a *Assembly, r RegARM64)

func (*ArchARM64) Machine

func (*ArchARM64) Machine() string

func (*ArchARM64) Specify

func (*ArchARM64) Specify(x Specific) int

type ArchAssembly

type ArchAssembly interface {
	Set(Reg)
	Label(name string)
	FunctionEpilogue()
	Function(name string)
	FunctionWithoutPrologue(name string)
	Return()
	ReturnWithoutEpilogue()
	Address(dest Reg, name string)
	MoveDef(dest Reg, name string)
	MoveImm(dest Reg, value int)
	MoveImm64(dest Reg, value uint64)
	MoveReg(dest, src Reg)
	MoveRegFloat(dest Reg, src FloatReg)
	AddImm(dest, src Reg, value int)
	AddReg(dest, src1, src2 Reg)
	SubtractImm(dest Reg, value int)
	SubtractReg(dest, src Reg)
	MultiplyImm(dest, src Reg, value int, temp Reg)
	AndImm(dest Reg, value int)
	AndReg(dest, src Reg)
	OrImm(dest Reg, value int)
	OrReg(dest, src Reg)
	ShiftImm(s Shift, r Reg, count int)
	Load(dest, base Reg, offset int)
	Load4Bytes(dest, base Reg, offset int)
	LoadByte(dest, base Reg, offset int)
	Store(base Reg, offset int, src Reg)
	Store4Bytes(base Reg, offset int, src Reg)
	Push(Reg)
	Pop(Reg)
	Call(name string)
	Jump(name string)
	JumpRegRoutine(r Reg, internalNamePrefix string)
	JumpIfBitSet(r Reg, bit uint, name string)
	JumpIfBitNotSet(r Reg, bit uint, name string)
	JumpIfImm(c Cond, r Reg, value int, name string)
	JumpIfReg(c Cond, dest, src Reg, name string)
	Syscall(Syscall)
	Unreachable()
}

type Assembly

type Assembly struct {
	Arch
	ArchAssembly
	*System
	// contains filtered or unexported fields
}

func NewAssembly

func NewAssembly(arch Arch, sys *System) *Assembly

func (*Assembly) Bytes

func (a *Assembly) Bytes() []byte

func (*Assembly) Reset

func (a *Assembly) Reset(regs ...Reg)

func (*Assembly) String

func (a *Assembly) String() string

type Cond

type Cond uint8
const (
	EQ Cond = iota
	NE
	LT
	LE
	GT
	GE
)

type FloatReg

type FloatReg uint8

type Reg

type Reg struct {
	AMD64 RegAMD64
	ARM64 RegARM64
	Use   string
}

Reg ister per CPU architecture.

func (Reg) As

func (r Reg) As(use string) Reg

As returns the same register with different usage.

type RegAMD64

type RegAMD64 uint8
const (
	RAX RegAMD64 = iota
	RCX
	RDX
	RBX
	RSP
	RBP
	RSI
	RDI
	R8
	R9
	R10
	R11
	R12
	R13
	R14
	R15
)

func (RegAMD64) String

func (r RegAMD64) String() string

type RegARM64

type RegARM64 uint8
const (
	X0 RegARM64 = iota
	X1
	X2
	X3
	X4
	X5
	X6
	X7
	X8
	X9
	X10
	X11
	X12
	X13
	X14
	X15
	X16
	X17
	X18
	X19
	X20
	X21
	X22
	X23
	X24
	X25
	X26
	X27
	X28
	X29
	XLR
	XSP
)

func (RegARM64) String

func (r RegARM64) String() string

type Shift

type Shift uint8
const (
	Left Shift = iota
	RightLogical
	RightArithmetic
)

type Specific

type Specific struct {
	AMD64 int
	ARM64 int
}

Specific value per CPU architecture.

type Syscall

type Syscall Specific

Syscall number per CPU architecture.

type System

type System struct {
	StackPtr  Reg
	SyscallNr Reg
	SysParams []Reg
	SysResult Reg
	LibParams []Reg
	LibResult Reg
}

func Host

func Host() *System

func Linux

func Linux() *System

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL