Memory 表示类型和存储局部变量?

Memory 表示类型和存储局部变量?,memory,assembly,compiler-construction,Memory,Assembly,Compiler Construction,我正在编写一个编译器,虽然我知道我需要做些什么来处理内置类型,比如Int,它可以放入寄存器并可以很好地推送到堆栈或其他任何地方,但我不知道如何处理用户定义的类型(这种语言主要是面向对象的),因此给出了以下示例: class Color { Color(Int r, Int g, Int b) r g b { } method GetR() Int { return r } } 其中,r,g和

我正在编写一个编译器,虽然我知道我需要做些什么来处理内置类型,比如
Int
,它可以放入寄存器并可以很好地推送到堆栈或其他任何地方,但我不知道如何处理用户定义的类型(这种语言主要是面向对象的),因此给出了以下示例:

class Color
{
    Color(Int r, Int g, Int b)
        r
        g
        b
    { }
    method GetR() Int
    {
        return r
    }
}
其中,
r
g
b
自动成为
Int
类型的成员变量。如何在例如
GetR()
中处理
Color
的实例

我的想法

我认为,最好的方法是保留一个寄存器(或者在每个方法的堆栈帧中保留一个空格更好?)来保存指向
this
的指针。然后,如果您想要实现
GetR()
,假设
r10
持有该指针,并且
r
成员恰好从该地址开始,您可以生成:

_G_Color_GetR:
    mov rax, [r10]
    ret

这是解决问题的好方法吗?如果不是,其他语言的编译器是如何解决的?

是的,这是典型的实现-像参数一样传递
这个
。要么像是额外的第一个参数,要么通过指定的寄存器。好的,非常感谢!