golang中汇编语义
bito> TEXT main.main(SB) D:/main.go
main.go:12 0xea7580 493b6610 CMPQ 0x10(R14), SP
main.go:12 0xea7584 0f8691000000 JBE 0xea761b
main.go:12 0xea758a 4883ec50 SUBQ $0x50, SP
main.go:12 0xea758e 48896c2448 MOVQ BP, 0x48(SP)
main.go:12 0xea7593 488d6c2448 LEAQ 0x48(SP), BP
main.go:14 0xea7598 488d05c1db2d00 LEAQ go.func.+16381(SB), AX
main.go:14 0xea759f 90 NOPL
main.go:14 0xea75a0 e89bd759ff CALL runtime.newproc(SB)
main.go:16 0xea75a5 488d05348a0800 LEAQ runtime.rodata+557024(SB), AX
main.go:16 0xea75ac bb01000000 MOVL $0x1, BX
main.go:16 0xea75b1 e84ae255ff CALL runtime.makechan(SB)
main.go:16 0xea75b6 4889442420 MOVQ AX, 0x20(SP)
main.go:17 0xea75bb 440f117c2428 MOVUPS X15, 0x28(SP)
main.go:17 0xea75c1 440f117c2438 MOVUPS X15, 0x38(SP)
main.go:17 0xea75c7 488d0d42c34000 LEAQ go.itab.syscall.Signal,os.Signal(SB), CX
main.go:17 0xea75ce 48894c2428 MOVQ CX, 0x28(SP)
main.go:17 0xea75d3 488d15060b4000 LEAQ $f64.fff0000000000000+256(SB), DX
main.go:17 0xea75da 4889542430 MOVQ DX, 0x30(SP)
main.go:17 0xea75df 48894c2438 MOVQ CX, 0x38(SP)
main.go:17 0xea75e4 488d0dfd0a4000 LEAQ $f64.fff0000000000000+264(SB), CX
main.go:17 0xea75eb 48894c2440 MOVQ CX, 0x40(SP)
main.go:17 0xea75f0 488d5c2428 LEAQ 0x28(SP), BX
main.go:17 0xea75f5 b902000000 MOVL $0x2, CX
main.go:17 0xea75fa 4889cf MOVQ CX, DI
main.go:17 0xea75fd 0f1f00 NOPL 0(AX)
main.go:17 0xea7600 e8bb7f61ff CALL os/signal.Notify(SB)
main.go:18 0xea7605 488b442420 MOVQ 0x20(SP), AX
main.go:18 0xea760a 31db XORL BX, BX
main.go:18 0xea760c e80ff155ff CALL runtime.chanrecv1(SB)
main.go:19 0xea7611 488b6c2448 MOVQ 0x48(SP), BP
main.go:19 0xea7616 4883c450 ADDQ $0x50, SP
main.go:19 0xea761a c3 RET
main.go:12 0xea761b 0f1f440000 NOPL 0(AX)(AX1)
main.go:12 0xea7620 e83be35bff CALL runtime.morestack_noctxt.abi0(SB)
main.go:12 0xea7625 e956ffffff JMP main.main(SB)
解释上面这段汇编代码
这段汇编代码是Golang程序的一部分,它展示了程序中的一些指令和操作。每一行代码都包含了指令的地址、指令本身以及注释。以下是对每一行代码的解释:
-
CMPQ 0x10(R14), SP
:比较R14寄存器偏移量为0x10的内存地址中的值和SP寄存器中的值。 -
JBE 0xea761b
:如果上一条指令的结果小于或等于0,则跳转到0xea761b的地址。 -
SUBQ $0x50, SP
:将SP寄存器的值减去0x50。 -
MOVQ BP, 0x48(SP)
:将BP寄存器中的值复制到偏移量为0x48的SP寄存器中。 -
LEAQ 0x48(SP), BP
:将偏移量为0x48的SP寄存器中的地址复制到BP寄存器中。 -
LEAQ go.func.*+16381(SB), AX
:将偏移量为16381的go.func.*标签的地址复制到AX寄存器中。 -
CALL runtime.newproc(SB)
:调用runtime.newproc函数。 -
LEAQ runtime.rodata+557024(SB), AX
:将偏移量为557024的runtime.rodata标签的地址复制到AX寄存器中。 -
MOVL $0x1, BX
:将1复制到BX寄存器中。 -
CALL runtime.makechan(SB)
:调用runtime.makechan函数。 -
MOVQ AX, 0x20(SP)
:将AX寄存器中的值复制到偏移量为0x20的SP寄存器中。 -
MOVUPS X15, 0x28(SP)
:将X15寄存器中的值复制到偏移量为0x28的SP寄存器中。 -
MOVUPS X15, 0x38(SP)
:将X15寄存器中的值复制到偏移量为0x38的SP寄存器中。 -
LEAQ go.itab.syscall.Signal,os.Signal(SB), CX
:将go.itab.syscall.Signal,os.Signal标签的地址复制到CX寄存器中。 -
MOVQ CX, 0x28(SP)
:将CX寄存器中的值复制到偏移量为0x28的SP寄存器中。 -
LEAQ $f64.fff0000000000000+256(SB), DX
:将偏移量为256的f64.fff0000000000000标签的地址复制到DX寄存器中。 -
MOVQ DX, 0x30(SP)
:将DX寄存器中的值复制到偏移量为0x30的SP寄存器中。 -
MOVQ CX, 0x38(SP)
:将CX寄存器中的值复制到偏移量为0x38的SP寄存器中。 -
LEAQ $f64.fff0000000000000+264(SB), CX
:将偏移量为264的f64.fff0000000000000标签的地址复制到CX寄存器中。 -
MOVQ CX, 0x40(SP)
:将CX寄存器中的值复制到偏移量为0x40的SP寄存器中。 -
LEAQ 0x28(SP), BX
:将偏移量为0x28的SP寄存器中的地址复制到BX寄存器中。 -
MOVL $0x2, CX
:将2复制到CX寄存器中。 -
MOVQ CX, DI
:将CX寄存器中的值复制到DI寄存器中。 -
CALL os/signal.Notify(SB)
:调用os/signal.Notify函数。 -
MOVQ 0x20(SP), AX
:将偏移量为0x20的SP寄存器中的值复制到AX寄存器中。 -
XORL BX, BX
:将BX寄存器中的值与0进行异或操作。 -
CALL runtime.chanrecv1(SB)
:调用runtime.chanrecv1函数。 -
MOVQ 0x48(SP), BP
:将偏移量为0x48的SP寄存器中的值复制到BP寄存器中。 -
ADDQ $0x50, SP
:将SP寄存器的值加上0x50。 -
RET
:返回到调用此函数的地址。 -
NOPL 0(AX)(AX*1)
:空操作。 -
CALL runtime.morestack_noctxt.abi0(SB)
:调用runtime.morestack_noctxt.abi0函数。 -
JMP main.main(SB)
:跳转到main.main函数的地址。