我将与您分享我精简的装配知识:
61 TEXT ·RawSyscall(SB),7,$062 MOVQ 16(SP), DI63 MOVQ 24(SP), SI64 MOVQ 32(SP), DX65 MOVQ $0, R1066 MOVQ $0, R867 MOVQ $0, R968 MOVQ 8(SP), AX // syscall entry69 ADDQ $0x2000000, AX70 SYSCALL71 JCC ok172 MOVQ $-1, 40(SP) // r173 MOVQ $0, 48(SP) // r274 MOVQ AX, 56(SP) // errno75 RET76 ok1:77 MOVQ AX, 40(SP) // r178 MOVQ DX, 48(SP) // r279 MOVQ $0, 56(SP) // errno80 RET81
- 61行是常规入口点
- 第76行是一个名为
ok1
- 第71行是有条件跳转到label的行
ok1
。
您在左侧每一行上看到的简称被称为
mnemonics,代表汇编说明:
MOVQ
表示移动四字(64位数据)。ADDQ
是“添加四字”。SYSCALL
很明显JCC
如果条件(条件标志由上一条指令设置),则为“跳转”RET
回来了
在助记符的右侧,您会发现每条指令的参数,它们基本上是常量和寄存器。
SP
是堆栈指针AX
是累加器BX
是基址寄存器
每个寄存器可以保存一定数量的数据。我相信在64位CPU架构上,每个寄存器实际上是64位。
Syscall和之间的唯一区别
RawSyscall是在第14、28和34行上,在哪里
Syscall调用
runtime·entersyscall(SB),
runtime·exitsyscall(SB)而
RawSyscall不会。我假设这意味着
Syscall通知运行时它已切换为阻塞的系统调用操作,并且可能使CPU时间流向另一个goroutine
/线程,而
RawSyscall只是阻塞了。



