我将与您分享我精简的装配知识:
61 TEXT ·RawSyscall(SB),7,$0
62 MOVQ 16(SP), DI
63 MOVQ 24(SP), SI
64 MOVQ 32(SP), DX
65 MOVQ $0, R10
66 MOVQ $0, R8
67 MOVQ $0, R9
68 MOVQ 8(SP), AX // syscall entry
69 ADDQ $0x2000000, AX
70 SYSCALL
71 JCC ok1
72 MOVQ $-1, 40(SP) // r1
73 MOVQ $0, 48(SP) // r2
74 MOVQ AX, 56(SP) // errno
75 RET
76 ok1:
77 MOVQ AX, 40(SP) // r1
78 MOVQ DX, 48(SP) // r2
79 MOVQ $0, 56(SP) // errno
80 RET
81
您在左侧每一行上看到的简称被称为mnemonics
,代表汇编说明:
在助记符的右侧,您会发现每条指令的参数,它们基本上是常量和寄存器。
每个寄存器可以保存一定数量的数据。我相信在64位cpu架构上,每个寄存器实际上是64位。
Syscall
和之间的唯一区别RawSyscall
是在第14、28和34行上,在哪里Syscall
调用runtime·entersyscall(SB)
,runtime·exitsyscall(SB)
而RawSyscall
不会。我假设这意味着Syscall
通知运行时它已切换为阻塞的系统调用操作,并且可能使cpu时间流向另一个goroutine /线程,而RawSyscall
只是阻塞了。