Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 用golang汇编语言实现golang方法_Assembly_Go - Fatal编程技术网

Assembly 用golang汇编语言实现golang方法

Assembly 用golang汇编语言实现golang方法,assembly,go,Assembly,Go,我编写了一个简单的go包,如下所示: package mytest type T int32 func (a T) MyTest(b T) (T, T) func (p *T) MyTestp(b T) (T, T) func MyTest(a, b T) (T, T) func MyTestp(p *T, b T) (T, T) TEXT ·MyTest(SB), $0-16 MOVL a + 0x0(FP), AX MOVL b + 0x4(FP), BX MOVL BX, CX AD

我编写了一个简单的go包,如下所示:

package mytest

type T int32

func (a T) MyTest(b T) (T, T)
func (p *T) MyTestp(b T) (T, T)
func MyTest(a, b T) (T, T)
func MyTestp(p *T, b T) (T, T)
TEXT ·MyTest(SB), $0-16
MOVL a + 0x0(FP), AX
MOVL b + 0x4(FP), BX
MOVL BX, CX
ADDL AX, CX
MOVL CX, r1 + 0x8(FP)
SUBL BX, AX
MOVL AX, r2 + 0xc(FP)
RET

TEXT ·MyTestp(SB), $0-24
MOVQ p + 0x0(FP), CX
MOVL b + 0x8(FP), BX
MOVL (CX), AX
MOVL BX, CX
ADDL AX, CX
MOVL CX, r1 + 0x10(FP)
SUBL BX, AX
MOVL AX, r2 + 0x14(FP)
RET

TEXT ·T·MyTest(SB), $0-16
MOVL a + 0x0(FP), AX
MOVL b + 0x4(FP), BX
MOVL BX, CX
ADDL AX, CX
MOVL CX, r1 + 0x8(FP)
SUBL BX, AX
MOVL AX, r2 + 0xc(FP)
RET

TEXT ·(*T)·MyTestp(SB), $0-24
MOVQ p + 0x0(FP), CX
MOVL b + 0x8(FP), BX
MOVL (CX), AX
MOVL BX, CX
ADDL AX, CX
MOVL CX, r1 + 0xC(FP)
SUBL BX, AX
MOVL AX, r2 + 0x10(FP)
RET
expected identifier, found *
相应的装配代码(由go工具objdump生成),如下所示:

package mytest

type T int32

func (a T) MyTest(b T) (T, T)
func (p *T) MyTestp(b T) (T, T)
func MyTest(a, b T) (T, T)
func MyTestp(p *T, b T) (T, T)
TEXT ·MyTest(SB), $0-16
MOVL a + 0x0(FP), AX
MOVL b + 0x4(FP), BX
MOVL BX, CX
ADDL AX, CX
MOVL CX, r1 + 0x8(FP)
SUBL BX, AX
MOVL AX, r2 + 0xc(FP)
RET

TEXT ·MyTestp(SB), $0-24
MOVQ p + 0x0(FP), CX
MOVL b + 0x8(FP), BX
MOVL (CX), AX
MOVL BX, CX
ADDL AX, CX
MOVL CX, r1 + 0x10(FP)
SUBL BX, AX
MOVL AX, r2 + 0x14(FP)
RET

TEXT ·T·MyTest(SB), $0-16
MOVL a + 0x0(FP), AX
MOVL b + 0x4(FP), BX
MOVL BX, CX
ADDL AX, CX
MOVL CX, r1 + 0x8(FP)
SUBL BX, AX
MOVL AX, r2 + 0xc(FP)
RET

TEXT ·(*T)·MyTestp(SB), $0-24
MOVQ p + 0x0(FP), CX
MOVL b + 0x8(FP), BX
MOVL (CX), AX
MOVL BX, CX
ADDL AX, CX
MOVL CX, r1 + 0xC(FP)
SUBL BX, AX
MOVL AX, r2 + 0x10(FP)
RET
expected identifier, found *
当我编译这些汇编代码时,除了“TEXT·(*T)·MyTestp(SB),$0-24”之外,一切正常,错误消息如下:

package mytest

type T int32

func (a T) MyTest(b T) (T, T)
func (p *T) MyTestp(b T) (T, T)
func MyTest(a, b T) (T, T)
func MyTestp(p *T, b T) (T, T)
TEXT ·MyTest(SB), $0-16
MOVL a + 0x0(FP), AX
MOVL b + 0x4(FP), BX
MOVL BX, CX
ADDL AX, CX
MOVL CX, r1 + 0x8(FP)
SUBL BX, AX
MOVL AX, r2 + 0xc(FP)
RET

TEXT ·MyTestp(SB), $0-24
MOVQ p + 0x0(FP), CX
MOVL b + 0x8(FP), BX
MOVL (CX), AX
MOVL BX, CX
ADDL AX, CX
MOVL CX, r1 + 0x10(FP)
SUBL BX, AX
MOVL AX, r2 + 0x14(FP)
RET

TEXT ·T·MyTest(SB), $0-16
MOVL a + 0x0(FP), AX
MOVL b + 0x4(FP), BX
MOVL BX, CX
ADDL AX, CX
MOVL CX, r1 + 0x8(FP)
SUBL BX, AX
MOVL AX, r2 + 0xc(FP)
RET

TEXT ·(*T)·MyTestp(SB), $0-24
MOVQ p + 0x0(FP), CX
MOVL b + 0x8(FP), BX
MOVL (CX), AX
MOVL BX, CX
ADDL AX, CX
MOVL CX, r1 + 0xC(FP)
SUBL BX, AX
MOVL AX, r2 + 0x10(FP)
RET
expected identifier, found *

我认为objdump使用可读的表示(*T)作为输出,但对于编译器来说,这是错误的。有人知道正确的含义吗?提前谢谢

好吧,你说的有3种不同的工具,至于go object dump,它确实会转储正确的符号。go编译器编译go源代码并生成上述符号。go汇编程序在没有修改的情况下不能使用带有“(”、“*”、”)和许多其他符号的符号。当它看到括号时,它希望里面是一个寄存器。所以你有一些选择,比如使用不同的汇编程序来支持类似的符号,你可以修改汇编程序来允许类似的符号,或者你可以将你的符号重命名为go汇编程序允许的符号。

好吧,你有三种不同的工具,对于go对象转储,它确实转储了正确的符号。go编译器编译go源代码并生成上述符号。go汇编程序在没有修改的情况下不能使用带有“(”、“*”、”)和许多其他符号的符号。当它看到括号时,它希望里面是一个寄存器。所以你有一些选择,比如使用一个不同的汇编程序来支持类似的符号,你可以修改汇编程序来允许类似的符号,或者你可以将你的符号重命名为go汇编程序允许的东西。

go汇编程序甚至支持定义方法吗?我只见过汇编中定义的函数,从来没有见过方法。不,T.MyTest是work。但是T.MyTestp无法编译您使用什么来编译程序集?我使用go build来编译项目。go程序集甚至支持定义方法吗?我只见过汇编中定义的函数,从来没有见过方法。不,T.MyTest是work。但是T.MyTestp无法编译您使用什么来编译程序集?我使用go build来编译项目。