golang中汇编语义

发布时间 2023-12-27 14:19:55作者: dx2019

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)(AX
1)
main.go:12 0xea7620 e83be35bff CALL runtime.morestack_noctxt.abi0(SB)
main.go:12 0xea7625 e956ffffff JMP main.main(SB)
解释上面这段汇编代码

这段汇编代码是Golang程序的一部分,它展示了程序中的一些指令和操作。每一行代码都包含了指令的地址、指令本身以及注释。以下是对每一行代码的解释:

  1. CMPQ 0x10(R14), SP:比较R14寄存器偏移量为0x10的内存地址中的值和SP寄存器中的值。

  2. JBE 0xea761b:如果上一条指令的结果小于或等于0,则跳转到0xea761b的地址。

  3. SUBQ $0x50, SP:将SP寄存器的值减去0x50。

  4. MOVQ BP, 0x48(SP):将BP寄存器中的值复制到偏移量为0x48的SP寄存器中。

  5. LEAQ 0x48(SP), BP:将偏移量为0x48的SP寄存器中的地址复制到BP寄存器中。

  6. LEAQ go.func.*+16381(SB), AX:将偏移量为16381的go.func.*标签的地址复制到AX寄存器中。

  7. CALL runtime.newproc(SB):调用runtime.newproc函数。

  8. LEAQ runtime.rodata+557024(SB), AX:将偏移量为557024的runtime.rodata标签的地址复制到AX寄存器中。

  9. MOVL $0x1, BX:将1复制到BX寄存器中。

  10. CALL runtime.makechan(SB):调用runtime.makechan函数。

  11. MOVQ AX, 0x20(SP):将AX寄存器中的值复制到偏移量为0x20的SP寄存器中。

  12. MOVUPS X15, 0x28(SP):将X15寄存器中的值复制到偏移量为0x28的SP寄存器中。

  13. MOVUPS X15, 0x38(SP):将X15寄存器中的值复制到偏移量为0x38的SP寄存器中。

  14. LEAQ go.itab.syscall.Signal,os.Signal(SB), CX:将go.itab.syscall.Signal,os.Signal标签的地址复制到CX寄存器中。

  15. MOVQ CX, 0x28(SP):将CX寄存器中的值复制到偏移量为0x28的SP寄存器中。

  16. LEAQ $f64.fff0000000000000+256(SB), DX:将偏移量为256的f64.fff0000000000000标签的地址复制到DX寄存器中。

  17. MOVQ DX, 0x30(SP):将DX寄存器中的值复制到偏移量为0x30的SP寄存器中。

  18. MOVQ CX, 0x38(SP):将CX寄存器中的值复制到偏移量为0x38的SP寄存器中。

  19. LEAQ $f64.fff0000000000000+264(SB), CX:将偏移量为264的f64.fff0000000000000标签的地址复制到CX寄存器中。

  20. MOVQ CX, 0x40(SP):将CX寄存器中的值复制到偏移量为0x40的SP寄存器中。

  21. LEAQ 0x28(SP), BX:将偏移量为0x28的SP寄存器中的地址复制到BX寄存器中。

  22. MOVL $0x2, CX:将2复制到CX寄存器中。

  23. MOVQ CX, DI:将CX寄存器中的值复制到DI寄存器中。

  24. CALL os/signal.Notify(SB):调用os/signal.Notify函数。

  25. MOVQ 0x20(SP), AX:将偏移量为0x20的SP寄存器中的值复制到AX寄存器中。

  26. XORL BX, BX:将BX寄存器中的值与0进行异或操作。

  27. CALL runtime.chanrecv1(SB):调用runtime.chanrecv1函数。

  28. MOVQ 0x48(SP), BP:将偏移量为0x48的SP寄存器中的值复制到BP寄存器中。

  29. ADDQ $0x50, SP:将SP寄存器的值加上0x50。

  30. RET:返回到调用此函数的地址。

  31. NOPL 0(AX)(AX*1):空操作。

  32. CALL runtime.morestack_noctxt.abi0(SB):调用runtime.morestack_noctxt.abi0函数。

  33. JMP main.main(SB):跳转到main.main函数的地址。