1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| "".toPtrSlice STEXT size=288 args=0x30 locals=0x60 0x0000 00000 (range.go:10) TEXT "".sum(SB), ABIInternal, $96-48 0x0028 00040 (range.go:12) LEAQ type.int(SB), AX 0x002f 00047 (range.go:12) MOVQ AX, (SP) 0x0033 00051 (range.go:12) CALL runtime.newobject(SB) # new(int) 0x0038 00056 (range.go:12) MOVQ 8(SP), AX # 返回值保存在AX,实际是*int指针 0x003d 00061 (range.go:12) MOVQ AX, "".&k+80(SP) # k是创建在堆上面的,因为逃逸了 0x0042 00066 (range.go:12) MOVQ "".slice+112(SP), CX # slice的底层数组地址 0x0047 00071 (range.go:12) MOVQ "".slice+104(SP), DX # slice的长度 0x004c 00076 (range.go:12) XORL BX, BX # 循环i 0x004e 00078 (range.go:11) LEAQ runtime.zerobase(SB), SI # ns的底层数组SI,一开始cap为0,底层数组初始化为runtime.zerobase 0x0055 00085 (range.go:11) XORL DI, DI # DI用于存储当前要写到ns的第几个元素 0x0057 00087 (range.go:11) XORL R8, R8 # R8存储ns的cap,一开始ns的cap是0 0x005a 00090 (range.go:12) JMP 98 # 首先跳转到98行 0x005c 00092 (range.go:12) INCQ BX # i++ 0x005f 00095 (range.go:15) MOVQ R9, DI # R9为ns当前的len,也就是下一次append的位置 # 这里是98行,也是循环开始的地方 0x0062 00098 (range.go:12) CMPQ BX, CX # i<len(slice) 0x0065 00101 (range.go:12) JGE 244 # 如果false,跳到244 0x006b 00107 (range.go:12) MOVQ (DX)(BX*8), R9 # 把切片第i个元素存到R9 0x006f 00111 (range.go:12) MOVQ R9, (AX) # 等价于:k=slice[i],这里的AX实际存的是地址,因此使用(AX) 0x0072 00114 (range.go:13) LEAQ 1(DI), R9 # R9存储DI+1,也就是append该元素后ns的len 0x0076 00118 (range.go:13) CMPQ R9, R8 # 判断ns是否有足够cap可以append 0x0079 00121 (range.go:13) JHI 152 # 不足,跳转过去执行扩容操作 0x007b 00123 (range.go:13) LEAQ (SI)(DI*8), R10 # 这个R10没有用到,不知道这行有什么用 0x0088 00136 (range.go:13) MOVQ AX, (SI)(DI*8) # 把AX存到ns[i],这里AX实际上就是k的地址 0x008c 00140 (range.go:13) JMP 92 # 跳转到92 0x0098 00152 (range.go:12) MOVQ BX, ""..autotmp_14+72(SP) 0x009d 00157 (range.go:15) MOVQ DI, "".ns.len+64(SP) # DI为ns当前的len 0x00a2 00162 (range.go:13) LEAQ type.*int(SB), AX 0x00a9 00169 (range.go:13) MOVQ AX, (SP) # *_type 0x00ad 00173 (range.go:13) MOVQ SI, 8(SP) # old slice data ptr 0x00b2 00178 (range.go:13) MOVQ DI, 16(SP) # old slice len 0x00b7 00183 (range.go:13) MOVQ R8, 24(SP) # old slice cap 0x00bc 00188 (range.go:13) MOVQ R9, 32(SP) # new cap,实际上就是len+1 0x00c1 00193 (range.go:13) CALL runtime.growslice(SB) # 扩容 0x00c6 00198 (range.go:13) MOVQ 40(SP), SI # 扩容后的 data ptr 0x00cb 00203 (range.go:13) MOVQ 48(SP), AX # 扩容后的len 0x00d0 00208 (range.go:13) MOVQ 56(SP), R8 # 扩容后的 cap # 下面这些指令是,扩容后把一些变量再存到寄存器中 0x00d5 00213 (range.go:13) LEAQ 1(AX), R9 # R9 = len+1 0x00d9 00217 (range.go:13) MOVQ "".&k+80(SP), AX # 把k的地址存到AX 0x00de 00222 (range.go:12) MOVQ "".slice+112(SP), CX 0x00e3 00227 (range.go:12) MOVQ "".slice+104(SP), DX 0x00e8 00232 (range.go:12) MOVQ ""..autotmp_14+72(SP), BX 0x00ed 00237 (range.go:13) MOVQ "".ns.len+64(SP), DI 0x00f2 00242 (range.go:13) JMP 123 0x00f4 00244 (range.go:15) MOVQ SI, "".~r1+128(SP) 0x00fc 00252 (range.go:15) MOVQ DI, "".~r1+136(SP) 0x0104 00260 (range.go:15) MOVQ R8, "".~r1+144(SP) 0x010c 00268 (range.go:15) MOVQ 88(SP), BP 0x0111 00273 (range.go:15) ADDQ $96, SP 0x0115 00277 (range.go:15) RET
|