package assembler import ( "bytes" "git.gammaspectra.live/WeebDataHoarder/compute-go/amd64" "testing" "git.gammaspectra.live/WeebDataHoarder/compute-go/assembler/obj" "git.gammaspectra.live/WeebDataHoarder/compute-go/assembler/obj/x86" ) func noop(builder *Builder) *obj.Prog { prog := builder.NewProg() prog.As = x86.ANOPL prog.From.Type = obj.TYPE_REG prog.From.Reg = x86.REG_AX return prog } func addImmediateByte(builder *Builder, in int32) *obj.Prog { prog := builder.NewProg() prog.As = x86.AADDB prog.To.Type = obj.TYPE_REG prog.To.Reg = x86.REG_AL prog.From.Type = obj.TYPE_CONST prog.From.Offset = int64(in) return prog } func movImmediateByte(builder *Builder, reg int16, in int32) *obj.Prog { prog := builder.NewProg() prog.As = x86.AMOVB prog.To.Type = obj.TYPE_REG prog.To.Reg = reg prog.From.Type = obj.TYPE_CONST prog.From.Offset = int64(in) return prog } func movMemByte(builder *Builder, intoReg, memReg int16) *obj.Prog { prog := builder.NewProg() prog.As = x86.AMOVB prog.To.Type = obj.TYPE_REG prog.To.Reg = intoReg prog.From.Type = obj.TYPE_MEM prog.From.Reg = memReg return prog } func TestBasic(t *testing.T) { b, _ := NewBuilder(amd64.ABIDefinition) b.AddInstruction(noop(b)) b.AddInstruction(movImmediateByte(b, x86.REG_AL, 16)) b.AddInstruction(addImmediateByte(b, 16)) got, errs := b.Function("", nil, 0, obj.NOFRAME|obj.NOSPLIT, nil) if errs != nil { for _, err := range errs { t.Error(err) } } want := []byte{0x0f, 0x1f, 0xc0, 0xb0, 0x10, 0x04, 0x10} if !bytes.Equal(got, want) { t.Errorf("assembly = %v, want %v", got, want) } } func TestMove(t *testing.T) { b, _ := NewBuilder(amd64.ABIDefinition) b.AddInstruction(noop(b)) b.AddInstruction(movMemByte(b, x86.REG_AL, x86.REG_BX)) got, errs := b.Function("", nil, 0, obj.NOFRAME|obj.NOSPLIT, nil) if errs != nil { for _, err := range errs { t.Error(err) } } want := []byte{0x0F, 0x1F, 0xC0, 0x8A, 0x03} if !bytes.Equal(got, want) { t.Errorf("assembly = %v (%X), want %v", got, got, want) } }