Programming/golang2023. 8. 24. 10:27

고언어 에서 디스어셈블 가능하대서 해보는데

먼가.. 많이 보던(?) objdump와는 출력 포맷이 달라서 찾아보게 됨.

$ GOARCH=arm64 go build -gcflags -S .
# tt
main.main STEXT size=240 args=0x0 locals=0x818 funcid=0x0 align=0x0
0x0000 00000 (/home/user/work/src/goneon/neon.go:3) TEXT main.main(SB), ABIInternal, $2080-0
0x0000 00000 (/home/user/work/src/goneon/neon.go:3) MOVD 16(g), R16
0x0004 00004 (/home/user/work/src/goneon/neon.go:3) PCDATA $0, $-2
0x0004 00004 (/home/user/work/src/goneon/neon.go:3) SUB $1952, RSP, R17
0x0008 00008 (/home/user/work/src/goneon/neon.go:3) CMP R16, R17
0x000c 00012 (/home/user/work/src/goneon/neon.go:3) BLS 220
0x0010 00016 (/home/user/work/src/goneon/neon.go:3) PCDATA $0, $-1
0x0010 00016 (/home/user/work/src/goneon/neon.go:3) SUB $2080, RSP, R20
0x0014 00020 (/home/user/work/src/goneon/neon.go:3) STP (R29, R30), -8(R20)
0x0018 00024 (/home/user/work/src/goneon/neon.go:3) PCDATA $0, $-2
0x0018 00024 (/home/user/work/src/goneon/neon.go:3) MOVD R20, RSP
0x001c 00028 (/home/user/work/src/goneon/neon.go:3) PCDATA $0, $-1
0x001c 00028 (/home/user/work/src/goneon/neon.go:3) SUB $8, RSP, R29
0x0020 00032 (/home/user/work/src/goneon/neon.go:3) FUNCDATA $0, gclocals·g2BeySu+wFnoycgXfElmcg==(SB)
0x0020 00032 (/home/user/work/src/goneon/neon.go:3) FUNCDATA $1, gclocals·g2BeySu+wFnoycgXfElmcg==(SB)
0x0020 00032 (<unknown line number>) NOP
0x0020 00032 (/home/user/work/src/goneon/neon.go:4) MOVD $main..autotmp_5-1024(SP), R20
0x0024 00036 (/home/user/work/src/goneon/neon.go:9) PCDATA $0, $-2
0x0024 00036 (/home/user/work/src/goneon/neon.go:9) ADR 52, runtime.duffzero(R27)(R27)(REG)
0x0028 00040 (/home/user/work/src/goneon/neon.go:9) STP (R29, R27), -24(RSP)
0x002c 00044 (/home/user/work/src/goneon/neon.go:9) SUB $24, RSP, R29
0x0030 00048 (/home/user/work/src/goneon/neon.go:9) DUFFZERO runtime.duffzero(SB)
0x0034 00052 (/home/user/work/src/goneon/neon.go:9) SUB $8, RSP, R29
0x0038 00056 (/home/user/work/src/goneon/neon.go:10) PCDATA $0, $-1
0x0038 00056 (/home/user/work/src/goneon/neon.go:10) MOVD $main..autotmp_6-2048(SP), R20
0x003c 00060 (/home/user/work/src/goneon/neon.go:10) PCDATA $0, $-2
0x003c 00060 (/home/user/work/src/goneon/neon.go:10) ADR 76, runtime.duffzero(R27)(R27)(REG)
0x0040 00064 (/home/user/work/src/goneon/neon.go:10) STP (R29, R27), -24(RSP)
0x0044 00068 (/home/user/work/src/goneon/neon.go:10) SUB $24, RSP, R29
0x0048 00072 (/home/user/work/src/goneon/neon.go:10) DUFFZERO runtime.duffzero(SB)
0x004c 00076 (/home/user/work/src/goneon/neon.go:10) SUB $8, RSP, R29
0x0050 00080 (/home/user/work/src/goneon/neon.go:10) PCDATA $0, $-1
0x0050 00080 (/home/user/work/src/goneon/neon.go:10) MOVD ZR, R0
0x0054 00084 (/home/user/work/src/goneon/neon.go:13) JMP 120
0x0058 00088 (/home/user/work/src/goneon/neon.go:14) SBFIZ $2, R0, $32, R2
0x005c 00092 (/home/user/work/src/goneon/neon.go:14) MOVD $main..autotmp_5-1024(SP), R3
0x0060 00096 (/home/user/work/src/goneon/neon.go:14) MOVW R0, (R3)(R2)
0x0064 00100 (/home/user/work/src/goneon/neon.go:15) MOVD $256, R4
0x0068 00104 (/home/user/work/src/goneon/neon.go:15) SUB R0, R4, R5
0x006c 00108 (/home/user/work/src/goneon/neon.go:15) MOVD $main..autotmp_6-2048(SP), R6
0x0070 00112 (/home/user/work/src/goneon/neon.go:15) MOVW R5, (R6)(R2)
0x0074 00116 (/home/user/work/src/goneon/neon.go:13) ADD $1, R0, R0
0x0078 00120 (/home/user/work/src/goneon/neon.go:13) CMPW $256, R0
0x007c 00124 (/home/user/work/src/goneon/neon.go:13) BGE 144
0x0080 00128 (/home/user/work/src/goneon/neon.go:14) MOVW R0, R2
0x0084 00132 (/home/user/work/src/goneon/neon.go:14) CMP $256, R2
0x0088 00136 (/home/user/work/src/goneon/neon.go:14) BLO 88
0x008c 00140 (/home/user/work/src/goneon/neon.go:14) JMP 204
0x0090 00144 (/home/user/work/src/goneon/neon.go:14) MOVD ZR, R0
0x0094 00148 (/home/user/work/src/goneon/neon.go:13) JMP 156
0x0098 00152 (/home/user/work/src/goneon/neon.go:18) ADD $1, R0, R0
0x009c 00156 (/home/user/work/src/goneon/neon.go:18) CMPW $256, R0
0x00a0 00160 (/home/user/work/src/goneon/neon.go:18) BGE 180
0x00a4 00164 (/home/user/work/src/goneon/neon.go:19) MOVW R0, R2
0x00a8 00168 (/home/user/work/src/goneon/neon.go:19) CMP $256, R2
0x00ac 00172 (/home/user/work/src/goneon/neon.go:19) BLO 152
0x00b0 00176 (/home/user/work/src/goneon/neon.go:19) JMP 192
0x00b4 00180 (/home/user/work/src/goneon/neon.go:5) LDP -8(RSP), (R29, R30)
0x00b8 00184 (/home/user/work/src/goneon/neon.go:5) ADD $2080, RSP
0x00bc 00188 (/home/user/work/src/goneon/neon.go:5) RET (R30)
0x00c0 00192 (/home/user/work/src/goneon/neon.go:19) MOVD R2, R0
0x00c4 00196 (/home/user/work/src/goneon/neon.go:19) MOVD $256, R1
0x00c8 00200 (/home/user/work/src/goneon/neon.go:19) PCDATA $1, $0
0x00c8 00200 (/home/user/work/src/goneon/neon.go:19) CALL runtime.panicIndex(SB)
0x00cc 00204 (/home/user/work/src/goneon/neon.go:14) MOVD R2, R0
0x00d0 00208 (/home/user/work/src/goneon/neon.go:14) MOVD $256, R1
0x00d4 00212 (/home/user/work/src/goneon/neon.go:14) CALL runtime.panicIndex(SB)
0x00d8 00216 (/home/user/work/src/goneon/neon.go:14) HINT $0
0x00dc 00220 (/home/user/work/src/goneon/neon.go:14) NOP
0x00dc 00220 (/home/user/work/src/goneon/neon.go:3) PCDATA $1, $-1
0x00dc 00220 (/home/user/work/src/goneon/neon.go:3) PCDATA $0, $-2
0x00dc 00220 (/home/user/work/src/goneon/neon.go:3) MOVD R30, R3
0x00e0 00224 (/home/user/work/src/goneon/neon.go:3) CALL runtime.morestack_noctxt(SB)
0x00e4 00228 (/home/user/work/src/goneon/neon.go:3) PCDATA $0, $-1
0x00e4 00228 (/home/user/work/src/goneon/neon.go:3) JMP 0
0x0000 90 0b 40 f9 f1 83 1e d1 3f 02 10 eb 89 06 00 54  ..@.....?......T
0x0010 f4 83 20 d1 9d fa 3f a9 9f 02 00 91 fd 23 00 d1  .. ...?......#..
0x0020 f4 63 10 91 9b 00 00 10 fd ef 3e a9 fd 63 00 d1  .c........>..c..
0x0030 00 00 00 94 fd 23 00 d1 f4 63 00 91 9b 00 00 10  .....#...c......
0x0040 fd ef 3e a9 fd 63 00 d1 00 00 00 94 fd 23 00 d1  ..>..c.......#..
0x0050 e0 03 1f aa 09 00 00 14 02 7c 7e 93 e3 63 10 91  .........|~..c..
0x0060 60 68 22 b8 e4 03 78 b2 85 00 00 cb e6 63 00 91  `h"...x......c..
0x0070 c5 68 22 b8 00 04 00 91 1f 00 04 71 aa 00 00 54  .h"........q...T
0x0080 02 7c 40 93 5f 00 04 f1 83 fe ff 54 10 00 00 14  .|@._......T....
0x0090 e0 03 1f aa 02 00 00 14 00 04 00 91 1f 00 04 71  ...............q
0x00a0 aa 00 00 54 02 7c 40 93 5f 00 04 f1 63 ff ff 54  ...T.|@._...c..T
0x00b0 04 00 00 14 fd fb 7f a9 ff 83 20 91 c0 03 5f d6  .......... ..._.
0x00c0 e0 03 02 aa e1 03 78 b2 00 00 00 94 e0 03 02 aa  ......x.........
0x00d0 e1 03 78 b2 00 00 00 94 1f 20 03 d5 e3 03 1e aa  ..x...... ......
0x00e0 00 00 00 94 c7 ff ff 17 00 00 00 00 00 00 00 00  ................
rel 48+4 t=9 runtime.duffzero+0
rel 72+4 t=9 runtime.duffzero+0
rel 200+4 t=9 runtime.panicIndex+0
rel 212+4 t=9 runtime.panicIndex+0
rel 224+4 t=9 runtime.morestack_noctxt+0
main.add STEXT size=240 args=0x0 locals=0x818 funcid=0x0 align=0x0
0x0000 00000 (/home/user/work/src/goneon/neon.go:7) TEXT main.add(SB), ABIInternal, $2080-0
0x0000 00000 (/home/user/work/src/goneon/neon.go:7) MOVD 16(g), R16
0x0004 00004 (/home/user/work/src/goneon/neon.go:7) PCDATA $0, $-2
0x0004 00004 (/home/user/work/src/goneon/neon.go:7) SUB $1952, RSP, R17
var symregexp = flag.String("s", "", "only dump symbols matching this regexp")
var gnuAsm = flag.Bool("gnu", false, "print GNU assembly next to Go assembly (where supported)")
var symRE *regexp.Regexp
0x0008 00008 (/home/user/work/src/goneon/neon.go:7) CMP R16, R17
0x000c 00012 (/home/user/work/src/goneon/neon.go:7) BLS 220
0x0010 00016 (/home/user/work/src/goneon/neon.go:7) PCDATA $0, $-1
0x0010 00016 (/home/user/work/src/goneon/neon.go:7) SUB $2080, RSP, R20
0x0014 00020 (/home/user/work/src/goneon/neon.go:7) STP (R29, R30), -8(R20)
0x0018 00024 (/home/user/work/src/goneon/neon.go:7) PCDATA $0, $-2
0x0018 00024 (/home/user/work/src/goneon/neon.go:7) MOVD R20, RSP
0x001c 00028 (/home/user/work/src/goneon/neon.go:7) PCDATA $0, $-1
0x001c 00028 (/home/user/work/src/goneon/neon.go:7) SUB $8, RSP, R29
0x0020 00032 (/home/user/work/src/goneon/neon.go:7) FUNCDATA $0, gclocals·g2BeySu+wFnoycgXfElmcg==(SB)
0x0020 00032 (/home/user/work/src/goneon/neon.go:7) FUNCDATA $1, gclocals·g2BeySu+wFnoycgXfElmcg==(SB)
0x0020 00032 (/home/user/work/src/goneon/neon.go:9) MOVD $main..autotmp_5-1024(SP), R20
0x0024 00036 (/home/user/work/src/goneon/neon.go:9) PCDATA $0, $-2
0x0024 00036 (/home/user/work/src/goneon/neon.go:9) ADR 52, runtime.duffzero(R27)(R27)(REG)
0x0028 00040 (/home/user/work/src/goneon/neon.go:9) STP (R29, R27), -24(RSP)
0x002c 00044 (/home/user/work/src/goneon/neon.go:9) SUB $24, RSP, R29
0x0030 00048 (/home/user/work/src/goneon/neon.go:9) DUFFZERO runtime.duffzero(SB)
0x0034 00052 (/home/user/work/src/goneon/neon.go:9) SUB $8, RSP, R29
0x0038 00056 (/home/user/work/src/goneon/neon.go:10) PCDATA $0, $-1
0x0038 00056 (/home/user/work/src/goneon/neon.go:10) MOVD $main..autotmp_6-2048(SP), R20
0x003c 00060 (/home/user/work/src/goneon/neon.go:10) PCDATA $0, $-2
0x003c 00060 (/home/user/work/src/goneon/neon.go:10) ADR 76, runtime.duffzero(R27)(R27)(REG)
0x0040 00064 (/home/user/work/src/goneon/neon.go:10) STP (R29, R27), -24(RSP)
0x0044 00068 (/home/user/work/src/goneon/neon.go:10) SUB $24, RSP, R29
0x0048 00072 (/home/user/work/src/goneon/neon.go:10) DUFFZERO runtime.duffzero(SB)
0x004c 00076 (/home/user/work/src/goneon/neon.go:10) SUB $8, RSP, R29
0x0050 00080 (/home/user/work/src/goneon/neon.go:10) PCDATA $0, $-1
0x0050 00080 (/home/user/work/src/goneon/neon.go:10) MOVD ZR, R0
0x0054 00084 (/home/user/work/src/goneon/neon.go:13) JMP 120
0x0058 00088 (/home/user/work/src/goneon/neon.go:14) SBFIZ $2, R0, $32, R2
0x005c 00092 (/home/user/work/src/goneon/neon.go:14) MOVD $main..autotmp_5-1024(SP), R3
0x0060 00096 (/home/user/work/src/goneon/neon.go:14) MOVW R0, (R3)(R2)
0x0064 00100 (/home/user/work/src/goneon/neon.go:15) MOVD $256, R4
0x0068 00104 (/home/user/work/src/goneon/neon.go:15) SUB R0, R4, R5
0x006c 00108 (/home/user/work/src/goneon/neon.go:15) MOVD $main..autotmp_6-2048(SP), R6
0x0070 00112 (/home/user/work/src/goneon/neon.go:15) MOVW R5, (R6)(R2)
0x0074 00116 (/home/user/work/src/goneon/neon.go:13) ADD $1, R0, R0
0x0078 00120 (/home/user/work/src/goneon/neon.go:13) CMPW $256, R0
0x007c 00124 (/home/user/work/src/goneon/neon.go:13) BGE 144
0x0080 00128 (/home/user/work/src/goneon/neon.go:14) MOVW R0, R2
0x0084 00132 (/home/user/work/src/goneon/neon.go:14) CMP $256, R2
0x0088 00136 (/home/user/work/src/goneon/neon.go:14) BLO 88
0x008c 00140 (/home/user/work/src/goneon/neon.go:14) JMP 204
0x0090 00144 (/home/user/work/src/goneon/neon.go:14) MOVD ZR, R0
0x0094 00148 (/home/user/work/src/goneon/neon.go:13) JMP 156
0x0098 00152 (/home/user/work/src/goneon/neon.go:18) ADD $1, R0, R0
0x009c 00156 (/home/user/work/src/goneon/neon.go:18) CMPW $256, R0
0x00a0 00160 (/home/user/work/src/goneon/neon.go:18) BGE 180
0x00a4 00164 (/home/user/work/src/goneon/neon.go:19) MOVW R0, R2
0x00a8 00168 (/home/user/work/src/goneon/neon.go:19) CMP $256, R2
0x00ac 00172 (/home/user/work/src/goneon/neon.go:19) BLO 152
0x00b0 00176 (/home/user/work/src/goneon/neon.go:19) JMP 192
0x00b4 00180 (/home/user/work/src/goneon/neon.go:21) LDP -8(RSP), (R29, R30)
0x00b8 00184 (/home/user/work/src/goneon/neon.go:21) ADD $2080, RSP
0x00bc 00188 (/home/user/work/src/goneon/neon.go:21) RET (R30)
0x00c0 00192 (/home/user/work/src/goneon/neon.go:19) MOVD R2, R0
0x00c4 00196 (/home/user/work/src/goneon/neon.go:19) MOVD $256, R1
0x00c8 00200 (/home/user/work/src/goneon/neon.go:19) PCDATA $1, $0
0x00c8 00200 (/home/user/work/src/goneon/neon.go:19) CALL runtime.panicIndex(SB)
0x00cc 00204 (/home/user/work/src/goneon/neon.go:14) MOVD R2, R0
0x00d0 00208 (/home/user/work/src/goneon/neon.go:14) MOVD $256, R1
0x00d4 00212 (/home/user/work/src/goneon/neon.go:14) CALL runtime.panicIndex(SB)
0x00d8 00216 (/home/user/work/src/goneon/neon.go:14) HINT $0
0x00dc 00220 (/home/user/work/src/goneon/neon.go:14) NOP
0x00dc 00220 (/home/user/work/src/goneon/neon.go:7) PCDATA $1, $-1
0x00dc 00220 (/home/user/work/src/goneon/neon.go:7) PCDATA $0, $-2
0x00dc 00220 (/home/user/work/src/goneon/neon.go:7) MOVD R30, R3
0x00e0 00224 (/home/user/work/src/goneon/neon.go:7) CALL runtime.morestack_noctxt(SB)
0x00e4 00228 (/home/user/work/src/goneon/neon.go:7) PCDATA $0, $-1
0x00e4 00228 (/home/user/work/src/goneon/neon.go:7) JMP 0
0x0000 90 0b 40 f9 f1 83 1e d1 3f 02 10 eb 89 06 00 54  ..@.....?......T
0x0010 f4 83 20 d1 9d fa 3f a9 9f 02 00 91 fd 23 00 d1  .. ...?......#..
0x0020 f4 63 10 91 9b 00 00 10 fd ef 3e a9 fd 63 00 d1  .c........>..c..
0x0030 00 00 00 94 fd 23 00 d1 f4 63 00 91 9b 00 00 10  .....#...c......
0x0040 fd ef 3e a9 fd 63 00 d1 00 00 00 94 fd 23 00 d1  ..>..c.......#..
0x0050 e0 03 1f aa 09 00 00 14 02 7c 7e 93 e3 63 10 91  .........|~..c..
0x0060 60 68 22 b8 e4 03 78 b2 85 00 00 cb e6 63 00 91  `h"...x......c..
0x0070 c5 68 22 b8 00 04 00 91 1f 00 04 71 aa 00 00 54  .h"........q...T
0x0080 02 7c 40 93 5f 00 04 f1 83 fe ff 54 10 00 00 14  .|@._......T....
0x0090 e0 03 1f aa 02 00 00 14 00 04 00 91 1f 00 04 71  ...............q
0x00a0 aa 00 00 54 02 7c 40 93 5f 00 04 f1 63 ff ff 54  ...T.|@._...c..T
0x00b0 04 00 00 14 fd fb 7f a9 ff 83 20 91 c0 03 5f d6  .......... ..._.
0x00c0 e0 03 02 aa e1 03 78 b2 00 00 00 94 e0 03 02 aa  ......x.........
0x00d0 e1 03 78 b2 00 00 00 94 1f 20 03 d5 e3 03 1e aa  ..x...... ......
0x00e0 00 00 00 94 c7 ff ff 17 00 00 00 00 00 00 00 00  ................
rel 48+4 t=9 runtime.duffzero+0
rel 72+4 t=9 runtime.duffzero+0
rel 200+4 t=9 runtime.panicIndex+0
rel 212+4 t=9 runtime.panicIndex+0
rel 224+4 t=9 runtime.morestack_noctxt+0
go:cuinfo.producer.main SDWARFCUINFO dupok size=0
0x0000 72 65 67 61 62 69                                regabi
go:cuinfo.packagename.main SDWARFCUINFO dupok size=0
0x0000 6d 61 69 6e                                      main
go:info.main.add$abstract SDWARFABSFCN dupok size=45
0x0000 05 6d 61 69 6e 2e 61 64 64 00 01 01 0e 61 00 08  .main.add....a..
0x0010 00 00 00 00 0e 62 00 09 00 00 00 00 0e 63 00 0a  .....b.......c..
0x0020 00 00 00 00 0e 69 00 0c 00 00 00 00 00           .....i.......
rel 16+4 t=31 go:info.[]int32+0
rel 24+4 t=31 go:info.[]int32+0
rel 32+4 t=31 go:info.[]int32+0
rel 40+4 t=31 go:info.int32+0
main..inittask SNOPTRDATA size=24
0x0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0x0010 00 00 00 00 00 00 00 00                          ........
type:.eqfunc1024 SRODATA dupok size=16
0x0000 00 00 00 00 00 00 00 00 00 04 00 00 00 00 00 00  ................
rel 0+8 t=1 runtime.memequal_varlen+0
runtime.memequal64·f SRODATA dupok size=8
0x0000 00 00 00 00 00 00 00 00                          ........
rel 0+8 t=1 runtime.memequal64+0
runtime.gcbits.0100000000000000 SRODATA dupok size=8
0x0000 01 00 00 00 00 00 00 00                          ........
type:.namedata.*[256]int32- SRODATA dupok size=13
0x0000 00 0b 2a 5b 32 35 36 5d 69 6e 74 33 32           ..*[256]int32
type:*[256]int32 SRODATA dupok size=56
0x0000 08 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00  ................
0x0010 5c eb 0a 2f 08 08 08 36 00 00 00 00 00 00 00 00  \../...6........
0x0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0x0030 00 00 00 00 00 00 00 00                          ........
rel 24+8 t=1 runtime.memequal64·f+0
rel 32+8 t=1 runtime.gcbits.0100000000000000+0
rel 40+4 t=5 type:.namedata.*[256]int32-+0
rel 48+8 t=1 type:[256]int32+0
runtime.gcbits. SRODATA dupok size=0
type:[256]int32 SRODATA dupok size=72
0x0000 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0x0010 1e 16 ae f5 0a 04 04 11 00 00 00 00 00 00 00 00  ................
0x0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0x0030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0x0040 00 01 00 00 00 00 00 00                          ........
rel 24+8 t=1 type:.eqfunc1024+0
rel 32+8 t=1 runtime.gcbits.+0
rel 40+4 t=5 type:.namedata.*[256]int32-+0
rel 44+4 t=-32763 type:*[256]int32+0
rel 48+8 t=1 type:int32+0
rel 56+8 t=1 type:[]int32+0
gclocals·g2BeySu+wFnoycgXfElmcg== SRODATA dupok size=8
0x0000 01 00 00 00 00 00 00 00                          ........

 

PCDATA 라는 녀석은 Program Counter는 절~대 아니고

걍 gabage collector 관련한 지시어라고.. 그런데 왜 컴파일러에게 알려주지?

The FUNCDATA and PCDATA directives contain information for use by the garbage collector; they are introduced by the compiler.

[링크 : https://doc.codingdict.com/golang/doc/golang.org/doc/asm.html]

  [링크 : https://stackoverflow.com/questions/53436811/what-is-the-meaning-of-pcdata-in-go-assembly]

 

Plan 9 어셈블러라는게 있는 듯.

The assembler is based on the input style of the Plan 9 assemblers, which is documented in detail elsewhere. 

[링크 : https://go.dev/doc/asm]

 

어쩌구 저쩌구.. MOVF와 MOVD를 이용해서 단배정도/복수배정도 실수에 대해서 읽거나 저장하는데

MOVWD, MOVWF, MOVDW, MOVWD, MOVFD, MOVFD 등으로 변환된다

라는데.. 레지스터도 그냥 R0~R12로만 되어있고 aarch64등과 같은 세부 아키텍쳐는 생략된 일종의 중간언어로 어셈을 쓰는 느낌?

ARM
The assembler provides access to R0 through R14 and the PC. The stack pointer is R13, the link register is R14, and the static base register is R12. R0 is the return register and also the register holding the first argument to a subroutine. The external registers in Plan 9’s C are allocated from R10 down. R11 is used by the loader as a temporary register. The assembler supports the CPSR and SPSR registers. It also knows about coprocessor registers C0 through C15. Floating registers are F0 through F7, FPSR and FPCR.
As with the other architectures, loads and stores are called MOV, e.g. MOVW for load word or store word, and MOVM for load or store multiple, depending on the operands.
Addressing modes are supported by suffixes to the instructions: .IA (increment after), .IB (increment before), .DA (decrement after), and .DB (decrement before). These can only be used with the MOV instructions. The move multiple instruction, MOVM, defines a range of registers using brackets, e.g. [R0-R12]. The special MOVM addressing mode bits W, U, and P are written in the same manner, for example, MOVM.DB.W. A .S suffix allows a MOVM instruction to access user R13 and R14 when in another processor mode. Shifts and rotates in addressing modes are supported by binary operators << (logical left shift), >> (logical right shift), -> (arithmetic right shift), and @> (rotate right); for example R7>>R2or R2@>2. The assembler does not support indexing by a shifted expression; only names can be doubly indexed.
Any instruction can be followed by a suffix that makes the instruction conditional: .EQ, .NE, and so on, as in the ARM manual, with synonyms .HS (for .CS) and .LO (for .CC), for example ADD.NE. Arithmetic and logical instructions can have a .S suffix, as ARM allows, to set condition codes.
The syntax of the MCR and MRC coprocessor instructions is largely as in the manual, with the usual adjustments. The assembler directly supports only the ARM floating-point coprocessor operations used by the compiler: CMP, ADD, SUB, MUL, and DIV, all with F or D suffix selecting single or double precision. Floating-point load or store become MOVF and MOVD. Conversion instructions are also specified by moves: MOVWD, MOVWF, MOVDW, MOVWD, MOVFD, and MOVDF.

[링크 : https://9p.io/sys/doc/asm.html]

 

 

 

'Programming > golang' 카테고리의 다른 글

golang echo 패키지 소스  (0) 2023.09.13
go packed struct  (0) 2023.09.01
golang goarch=arm64 와 디스어셈블러  (0) 2023.08.23
golang echo 서버 이상한 버그 발견?  (0) 2023.06.27
go ws server client example  (0) 2023.06.08
Posted by 구차니
embeded/ARM2023. 8. 23. 18:57

armv7에 비해서 armv8(aarch64)의 simd 통합은 더 강해졌는지

명령어가 사라지고 src와 dst의 레지스터에 vertor와 scalar가 사용된다.

 

예전에 이상하다 싶어서 찾아두기만 한 녀석인데

add 명령은 그대로이고 v0 이라는 vertor 레지스터에 4s, 4개의 32bit 변수형(아마도 signed int?)을

한번에 더하는 계산을 하라고 시킨다.

dst, src1, oper 일테니까 v0.4s = v0.4s + v1.4s 로 보면 될 듯.

 

add     v0.4s, v0.4s, v1.4s

 

2021.06.30 - [embeded/raspberry pi] - aarch, armv8 asimd build (neon)

 

scalar

평범(?)한 Q / D / S / H / B

[링크 : https://developer.arm.com/documentation/den0024/a/ARMv8-Registers/NEON-and-floating-point-registers/Scalar-register-sizes]

 

vector

D가 아마도 double형 같은 64bit(8byte) 변수일텐데

그것 조차도 한번에 2개씩 연산이 가능한 레지스터라니..

[링크 : https://developer.arm.com/documentation/den0024/a/ARMv8-Registers/NEON-and-floating-point-registers/Vector-register-sizes]

'embeded > ARM' 카테고리의 다른 글

arm asm rev  (0) 2023.09.14
cortex-a53  (0) 2023.08.31
arm vsub operator  (0) 2023.08.09
ARM NEON SLP  (0) 2023.08.07
cortex a9 ptm  (0) 2023.07.21
Posted by 구차니
Programming/golang2023. 8. 23. 17:19

go 프로그램도 java와 같은 독립된 환경이 아닌 일반적인 c와 같은 실행환경에서 도는 애다 보니

결국에는 기계어로 전환되고 objdump를 통해 디스어셈블을 할 수 있긴한데

go tool objdump를 통해 나오는 결과와 objdump를 통해 나오는 결과가 상이하다

go build -gcflags -S program.go
If you already have a compiled program and want to see the assembly code you can disassemble it with 
go tool objdump binaryFile.

[링크 : https://www.grant.pizza/blog/dissecting-go-binaries/]

 

명렁어 자체는 특이한 건 없다.

go tool objdump [-s symregexp] binary

[링크 : https://pkg.go.dev/cmd/objdump]

 

요런 go 소스를 작성하고

$ vi neon.go 
  1 package main
  2 
  3 func main() {
  4         add()
  5 }
  6 
  7 func add() {
  8         a := make([]int32, 256)
  9         b := make([]int32, 256)
 10         c := make([]int32, 256)
 11 
 12         var i int32
 13         for i = 0; i < 256; i++ {
 14                 b[i] = i;
 15                 c[i] = 256 - i;
 16         }
 17 
 18         for i = 0; i < 256; i++ {
 19                 a[i] = b[i] + c[i]
 20         }
 21 }

 

go build를 통해 빌드하면 디스어셈블 해주는데

출력 포맷이 objdump와 다른데다가.. 소스 라인만 보이고 매칭이 안되서 이래저래 불편..

그 와중에 먼가.. x86 ASM 같은 느낌은 왜일까..

일종의 중간(?) 언어로 어셈을 쓰고 이걸 다시 아키텍쳐별로 변환하는건가?

$ GOARCH=arm64 go build -gcflags -S .
# tt
main.main STEXT size=240 args=0x0 locals=0x818 funcid=0x0 align=0x0
0x0000 00000 (/home/user/work/src/goneon/neon.go:3) TEXT main.main(SB), ABIInternal, $2080-0
0x0000 00000 (/home/user/work/src/goneon/neon.go:3) MOVD 16(g), R16
0x0004 00004 (/home/user/work/src/goneon/neon.go:3) PCDATA $0, $-2
0x0004 00004 (/home/user/work/src/goneon/neon.go:3) SUB $1952, RSP, R17
0x0008 00008 (/home/user/work/src/goneon/neon.go:3) CMP R16, R17
0x000c 00012 (/home/user/work/src/goneon/neon.go:3) BLS 220
0x0010 00016 (/home/user/work/src/goneon/neon.go:3) PCDATA $0, $-1
0x0010 00016 (/home/user/work/src/goneon/neon.go:3) SUB $2080, RSP, R20
0x0014 00020 (/home/user/work/src/goneon/neon.go:3) STP (R29, R30), -8(R20)
0x0018 00024 (/home/user/work/src/goneon/neon.go:3) PCDATA $0, $-2
0x0018 00024 (/home/user/work/src/goneon/neon.go:3) MOVD R20, RSP
0x001c 00028 (/home/user/work/src/goneon/neon.go:3) PCDATA $0, $-1
0x001c 00028 (/home/user/work/src/goneon/neon.go:3) SUB $8, RSP, R29
0x0020 00032 (/home/user/work/src/goneon/neon.go:3) FUNCDATA $0, gclocals·g2BeySu+wFnoycgXfElmcg==(SB)
0x0020 00032 (/home/user/work/src/goneon/neon.go:3) FUNCDATA $1, gclocals·g2BeySu+wFnoycgXfElmcg==(SB)
0x0020 00032 (<unknown line number>) NOP
0x0020 00032 (/home/user/work/src/goneon/neon.go:4) MOVD $main..autotmp_5-1024(SP), R20
0x0024 00036 (/home/user/work/src/goneon/neon.go:9) PCDATA $0, $-2
0x0024 00036 (/home/user/work/src/goneon/neon.go:9) ADR 52, runtime.duffzero(R27)(R27)(REG)
0x0028 00040 (/home/user/work/src/goneon/neon.go:9) STP (R29, R27), -24(RSP)
0x002c 00044 (/home/user/work/src/goneon/neon.go:9) SUB $24, RSP, R29
0x0030 00048 (/home/user/work/src/goneon/neon.go:9) DUFFZERO runtime.duffzero(SB)
0x0034 00052 (/home/user/work/src/goneon/neon.go:9) SUB $8, RSP, R29
0x0038 00056 (/home/user/work/src/goneon/neon.go:10) PCDATA $0, $-1
0x0038 00056 (/home/user/work/src/goneon/neon.go:10) MOVD $main..autotmp_6-2048(SP), R20
0x003c 00060 (/home/user/work/src/goneon/neon.go:10) PCDATA $0, $-2
0x003c 00060 (/home/user/work/src/goneon/neon.go:10) ADR 76, runtime.duffzero(R27)(R27)(REG)
0x0040 00064 (/home/user/work/src/goneon/neon.go:10) STP (R29, R27), -24(RSP)
0x0044 00068 (/home/user/work/src/goneon/neon.go:10) SUB $24, RSP, R29
0x0048 00072 (/home/user/work/src/goneon/neon.go:10) DUFFZERO runtime.duffzero(SB)
0x004c 00076 (/home/user/work/src/goneon/neon.go:10) SUB $8, RSP, R29
0x0050 00080 (/home/user/work/src/goneon/neon.go:10) PCDATA $0, $-1
0x0050 00080 (/home/user/work/src/goneon/neon.go:10) MOVD ZR, R0
0x0054 00084 (/home/user/work/src/goneon/neon.go:13) JMP 120
0x0058 00088 (/home/user/work/src/goneon/neon.go:14) SBFIZ $2, R0, $32, R2
0x005c 00092 (/home/user/work/src/goneon/neon.go:14) MOVD $main..autotmp_5-1024(SP), R3
0x0060 00096 (/home/user/work/src/goneon/neon.go:14) MOVW R0, (R3)(R2)
0x0064 00100 (/home/user/work/src/goneon/neon.go:15) MOVD $256, R4
0x0068 00104 (/home/user/work/src/goneon/neon.go:15) SUB R0, R4, R5
0x006c 00108 (/home/user/work/src/goneon/neon.go:15) MOVD $main..autotmp_6-2048(SP), R6
0x0070 00112 (/home/user/work/src/goneon/neon.go:15) MOVW R5, (R6)(R2)
0x0074 00116 (/home/user/work/src/goneon/neon.go:13) ADD $1, R0, R0
0x0078 00120 (/home/user/work/src/goneon/neon.go:13) CMPW $256, R0
0x007c 00124 (/home/user/work/src/goneon/neon.go:13) BGE 144
0x0080 00128 (/home/user/work/src/goneon/neon.go:14) MOVW R0, R2
0x0084 00132 (/home/user/work/src/goneon/neon.go:14) CMP $256, R2
0x0088 00136 (/home/user/work/src/goneon/neon.go:14) BLO 88
0x008c 00140 (/home/user/work/src/goneon/neon.go:14) JMP 204
0x0090 00144 (/home/user/work/src/goneon/neon.go:14) MOVD ZR, R0
0x0094 00148 (/home/user/work/src/goneon/neon.go:13) JMP 156
0x0098 00152 (/home/user/work/src/goneon/neon.go:18) ADD $1, R0, R0
0x009c 00156 (/home/user/work/src/goneon/neon.go:18) CMPW $256, R0
0x00a0 00160 (/home/user/work/src/goneon/neon.go:18) BGE 180
0x00a4 00164 (/home/user/work/src/goneon/neon.go:19) MOVW R0, R2
0x00a8 00168 (/home/user/work/src/goneon/neon.go:19) CMP $256, R2
0x00ac 00172 (/home/user/work/src/goneon/neon.go:19) BLO 152
0x00b0 00176 (/home/user/work/src/goneon/neon.go:19) JMP 192
0x00b4 00180 (/home/user/work/src/goneon/neon.go:5) LDP -8(RSP), (R29, R30)
0x00b8 00184 (/home/user/work/src/goneon/neon.go:5) ADD $2080, RSP
0x00bc 00188 (/home/user/work/src/goneon/neon.go:5) RET (R30)
0x00c0 00192 (/home/user/work/src/goneon/neon.go:19) MOVD R2, R0
0x00c4 00196 (/home/user/work/src/goneon/neon.go:19) MOVD $256, R1
0x00c8 00200 (/home/user/work/src/goneon/neon.go:19) PCDATA $1, $0
0x00c8 00200 (/home/user/work/src/goneon/neon.go:19) CALL runtime.panicIndex(SB)
0x00cc 00204 (/home/user/work/src/goneon/neon.go:14) MOVD R2, R0
0x00d0 00208 (/home/user/work/src/goneon/neon.go:14) MOVD $256, R1
0x00d4 00212 (/home/user/work/src/goneon/neon.go:14) CALL runtime.panicIndex(SB)
0x00d8 00216 (/home/user/work/src/goneon/neon.go:14) HINT $0
0x00dc 00220 (/home/user/work/src/goneon/neon.go:14) NOP
0x00dc 00220 (/home/user/work/src/goneon/neon.go:3) PCDATA $1, $-1
0x00dc 00220 (/home/user/work/src/goneon/neon.go:3) PCDATA $0, $-2
0x00dc 00220 (/home/user/work/src/goneon/neon.go:3) MOVD R30, R3
0x00e0 00224 (/home/user/work/src/goneon/neon.go:3) CALL runtime.morestack_noctxt(SB)
0x00e4 00228 (/home/user/work/src/goneon/neon.go:3) PCDATA $0, $-1
0x00e4 00228 (/home/user/work/src/goneon/neon.go:3) JMP 0
0x0000 90 0b 40 f9 f1 83 1e d1 3f 02 10 eb 89 06 00 54  ..@.....?......T
0x0010 f4 83 20 d1 9d fa 3f a9 9f 02 00 91 fd 23 00 d1  .. ...?......#..
0x0020 f4 63 10 91 9b 00 00 10 fd ef 3e a9 fd 63 00 d1  .c........>..c..
0x0030 00 00 00 94 fd 23 00 d1 f4 63 00 91 9b 00 00 10  .....#...c......
0x0040 fd ef 3e a9 fd 63 00 d1 00 00 00 94 fd 23 00 d1  ..>..c.......#..
0x0050 e0 03 1f aa 09 00 00 14 02 7c 7e 93 e3 63 10 91  .........|~..c..
0x0060 60 68 22 b8 e4 03 78 b2 85 00 00 cb e6 63 00 91  `h"...x......c..
0x0070 c5 68 22 b8 00 04 00 91 1f 00 04 71 aa 00 00 54  .h"........q...T
0x0080 02 7c 40 93 5f 00 04 f1 83 fe ff 54 10 00 00 14  .|@._......T....
0x0090 e0 03 1f aa 02 00 00 14 00 04 00 91 1f 00 04 71  ...............q
0x00a0 aa 00 00 54 02 7c 40 93 5f 00 04 f1 63 ff ff 54  ...T.|@._...c..T
0x00b0 04 00 00 14 fd fb 7f a9 ff 83 20 91 c0 03 5f d6  .......... ..._.
0x00c0 e0 03 02 aa e1 03 78 b2 00 00 00 94 e0 03 02 aa  ......x.........
0x00d0 e1 03 78 b2 00 00 00 94 1f 20 03 d5 e3 03 1e aa  ..x...... ......
0x00e0 00 00 00 94 c7 ff ff 17 00 00 00 00 00 00 00 00  ................
rel 48+4 t=9 runtime.duffzero+0
rel 72+4 t=9 runtime.duffzero+0
rel 200+4 t=9 runtime.panicIndex+0
rel 212+4 t=9 runtime.panicIndex+0
rel 224+4 t=9 runtime.morestack_noctxt+0
main.add STEXT size=240 args=0x0 locals=0x818 funcid=0x0 align=0x0
0x0000 00000 (/home/user/work/src/goneon/neon.go:7) TEXT main.add(SB), ABIInternal, $2080-0
0x0000 00000 (/home/user/work/src/goneon/neon.go:7) MOVD 16(g), R16
0x0004 00004 (/home/user/work/src/goneon/neon.go:7) PCDATA $0, $-2
0x0004 00004 (/home/user/work/src/goneon/neon.go:7) SUB $1952, RSP, R17
var symregexp = flag.String("s", "", "only dump symbols matching this regexp")
var gnuAsm = flag.Bool("gnu", false, "print GNU assembly next to Go assembly (where supported)")
var symRE *regexp.Regexp
0x0008 00008 (/home/user/work/src/goneon/neon.go:7) CMP R16, R17
0x000c 00012 (/home/user/work/src/goneon/neon.go:7) BLS 220
0x0010 00016 (/home/user/work/src/goneon/neon.go:7) PCDATA $0, $-1
0x0010 00016 (/home/user/work/src/goneon/neon.go:7) SUB $2080, RSP, R20
0x0014 00020 (/home/user/work/src/goneon/neon.go:7) STP (R29, R30), -8(R20)
0x0018 00024 (/home/user/work/src/goneon/neon.go:7) PCDATA $0, $-2
0x0018 00024 (/home/user/work/src/goneon/neon.go:7) MOVD R20, RSP
0x001c 00028 (/home/user/work/src/goneon/neon.go:7) PCDATA $0, $-1
0x001c 00028 (/home/user/work/src/goneon/neon.go:7) SUB $8, RSP, R29
0x0020 00032 (/home/user/work/src/goneon/neon.go:7) FUNCDATA $0, gclocals·g2BeySu+wFnoycgXfElmcg==(SB)
0x0020 00032 (/home/user/work/src/goneon/neon.go:7) FUNCDATA $1, gclocals·g2BeySu+wFnoycgXfElmcg==(SB)
0x0020 00032 (/home/user/work/src/goneon/neon.go:9) MOVD $main..autotmp_5-1024(SP), R20
0x0024 00036 (/home/user/work/src/goneon/neon.go:9) PCDATA $0, $-2
0x0024 00036 (/home/user/work/src/goneon/neon.go:9) ADR 52, runtime.duffzero(R27)(R27)(REG)
0x0028 00040 (/home/user/work/src/goneon/neon.go:9) STP (R29, R27), -24(RSP)
0x002c 00044 (/home/user/work/src/goneon/neon.go:9) SUB $24, RSP, R29
0x0030 00048 (/home/user/work/src/goneon/neon.go:9) DUFFZERO runtime.duffzero(SB)
0x0034 00052 (/home/user/work/src/goneon/neon.go:9) SUB $8, RSP, R29
0x0038 00056 (/home/user/work/src/goneon/neon.go:10) PCDATA $0, $-1
0x0038 00056 (/home/user/work/src/goneon/neon.go:10) MOVD $main..autotmp_6-2048(SP), R20
0x003c 00060 (/home/user/work/src/goneon/neon.go:10) PCDATA $0, $-2
0x003c 00060 (/home/user/work/src/goneon/neon.go:10) ADR 76, runtime.duffzero(R27)(R27)(REG)
0x0040 00064 (/home/user/work/src/goneon/neon.go:10) STP (R29, R27), -24(RSP)
0x0044 00068 (/home/user/work/src/goneon/neon.go:10) SUB $24, RSP, R29
0x0048 00072 (/home/user/work/src/goneon/neon.go:10) DUFFZERO runtime.duffzero(SB)
0x004c 00076 (/home/user/work/src/goneon/neon.go:10) SUB $8, RSP, R29
0x0050 00080 (/home/user/work/src/goneon/neon.go:10) PCDATA $0, $-1
0x0050 00080 (/home/user/work/src/goneon/neon.go:10) MOVD ZR, R0
0x0054 00084 (/home/user/work/src/goneon/neon.go:13) JMP 120
0x0058 00088 (/home/user/work/src/goneon/neon.go:14) SBFIZ $2, R0, $32, R2
0x005c 00092 (/home/user/work/src/goneon/neon.go:14) MOVD $main..autotmp_5-1024(SP), R3
0x0060 00096 (/home/user/work/src/goneon/neon.go:14) MOVW R0, (R3)(R2)
0x0064 00100 (/home/user/work/src/goneon/neon.go:15) MOVD $256, R4
0x0068 00104 (/home/user/work/src/goneon/neon.go:15) SUB R0, R4, R5
0x006c 00108 (/home/user/work/src/goneon/neon.go:15) MOVD $main..autotmp_6-2048(SP), R6
0x0070 00112 (/home/user/work/src/goneon/neon.go:15) MOVW R5, (R6)(R2)
0x0074 00116 (/home/user/work/src/goneon/neon.go:13) ADD $1, R0, R0
0x0078 00120 (/home/user/work/src/goneon/neon.go:13) CMPW $256, R0
0x007c 00124 (/home/user/work/src/goneon/neon.go:13) BGE 144
0x0080 00128 (/home/user/work/src/goneon/neon.go:14) MOVW R0, R2
0x0084 00132 (/home/user/work/src/goneon/neon.go:14) CMP $256, R2
0x0088 00136 (/home/user/work/src/goneon/neon.go:14) BLO 88
0x008c 00140 (/home/user/work/src/goneon/neon.go:14) JMP 204
0x0090 00144 (/home/user/work/src/goneon/neon.go:14) MOVD ZR, R0
0x0094 00148 (/home/user/work/src/goneon/neon.go:13) JMP 156
0x0098 00152 (/home/user/work/src/goneon/neon.go:18) ADD $1, R0, R0
0x009c 00156 (/home/user/work/src/goneon/neon.go:18) CMPW $256, R0
0x00a0 00160 (/home/user/work/src/goneon/neon.go:18) BGE 180
0x00a4 00164 (/home/user/work/src/goneon/neon.go:19) MOVW R0, R2
0x00a8 00168 (/home/user/work/src/goneon/neon.go:19) CMP $256, R2
0x00ac 00172 (/home/user/work/src/goneon/neon.go:19) BLO 152
0x00b0 00176 (/home/user/work/src/goneon/neon.go:19) JMP 192
0x00b4 00180 (/home/user/work/src/goneon/neon.go:21) LDP -8(RSP), (R29, R30)
0x00b8 00184 (/home/user/work/src/goneon/neon.go:21) ADD $2080, RSP
0x00bc 00188 (/home/user/work/src/goneon/neon.go:21) RET (R30)
0x00c0 00192 (/home/user/work/src/goneon/neon.go:19) MOVD R2, R0
0x00c4 00196 (/home/user/work/src/goneon/neon.go:19) MOVD $256, R1
0x00c8 00200 (/home/user/work/src/goneon/neon.go:19) PCDATA $1, $0
0x00c8 00200 (/home/user/work/src/goneon/neon.go:19) CALL runtime.panicIndex(SB)
0x00cc 00204 (/home/user/work/src/goneon/neon.go:14) MOVD R2, R0
0x00d0 00208 (/home/user/work/src/goneon/neon.go:14) MOVD $256, R1
0x00d4 00212 (/home/user/work/src/goneon/neon.go:14) CALL runtime.panicIndex(SB)
0x00d8 00216 (/home/user/work/src/goneon/neon.go:14) HINT $0
0x00dc 00220 (/home/user/work/src/goneon/neon.go:14) NOP
0x00dc 00220 (/home/user/work/src/goneon/neon.go:7) PCDATA $1, $-1
0x00dc 00220 (/home/user/work/src/goneon/neon.go:7) PCDATA $0, $-2
0x00dc 00220 (/home/user/work/src/goneon/neon.go:7) MOVD R30, R3
0x00e0 00224 (/home/user/work/src/goneon/neon.go:7) CALL runtime.morestack_noctxt(SB)
0x00e4 00228 (/home/user/work/src/goneon/neon.go:7) PCDATA $0, $-1
0x00e4 00228 (/home/user/work/src/goneon/neon.go:7) JMP 0
0x0000 90 0b 40 f9 f1 83 1e d1 3f 02 10 eb 89 06 00 54  ..@.....?......T
0x0010 f4 83 20 d1 9d fa 3f a9 9f 02 00 91 fd 23 00 d1  .. ...?......#..
0x0020 f4 63 10 91 9b 00 00 10 fd ef 3e a9 fd 63 00 d1  .c........>..c..
0x0030 00 00 00 94 fd 23 00 d1 f4 63 00 91 9b 00 00 10  .....#...c......
0x0040 fd ef 3e a9 fd 63 00 d1 00 00 00 94 fd 23 00 d1  ..>..c.......#..
0x0050 e0 03 1f aa 09 00 00 14 02 7c 7e 93 e3 63 10 91  .........|~..c..
0x0060 60 68 22 b8 e4 03 78 b2 85 00 00 cb e6 63 00 91  `h"...x......c..
0x0070 c5 68 22 b8 00 04 00 91 1f 00 04 71 aa 00 00 54  .h"........q...T
0x0080 02 7c 40 93 5f 00 04 f1 83 fe ff 54 10 00 00 14  .|@._......T....
0x0090 e0 03 1f aa 02 00 00 14 00 04 00 91 1f 00 04 71  ...............q
0x00a0 aa 00 00 54 02 7c 40 93 5f 00 04 f1 63 ff ff 54  ...T.|@._...c..T
0x00b0 04 00 00 14 fd fb 7f a9 ff 83 20 91 c0 03 5f d6  .......... ..._.
0x00c0 e0 03 02 aa e1 03 78 b2 00 00 00 94 e0 03 02 aa  ......x.........
0x00d0 e1 03 78 b2 00 00 00 94 1f 20 03 d5 e3 03 1e aa  ..x...... ......
0x00e0 00 00 00 94 c7 ff ff 17 00 00 00 00 00 00 00 00  ................
rel 48+4 t=9 runtime.duffzero+0
rel 72+4 t=9 runtime.duffzero+0
rel 200+4 t=9 runtime.panicIndex+0
rel 212+4 t=9 runtime.panicIndex+0
rel 224+4 t=9 runtime.morestack_noctxt+0
go:cuinfo.producer.main SDWARFCUINFO dupok size=0
0x0000 72 65 67 61 62 69                                regabi
go:cuinfo.packagename.main SDWARFCUINFO dupok size=0
0x0000 6d 61 69 6e                                      main
go:info.main.add$abstract SDWARFABSFCN dupok size=45
0x0000 05 6d 61 69 6e 2e 61 64 64 00 01 01 0e 61 00 08  .main.add....a..
0x0010 00 00 00 00 0e 62 00 09 00 00 00 00 0e 63 00 0a  .....b.......c..
0x0020 00 00 00 00 0e 69 00 0c 00 00 00 00 00           .....i.......
rel 16+4 t=31 go:info.[]int32+0
rel 24+4 t=31 go:info.[]int32+0
rel 32+4 t=31 go:info.[]int32+0
rel 40+4 t=31 go:info.int32+0
main..inittask SNOPTRDATA size=24
0x0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0x0010 00 00 00 00 00 00 00 00                          ........
type:.eqfunc1024 SRODATA dupok size=16
0x0000 00 00 00 00 00 00 00 00 00 04 00 00 00 00 00 00  ................
rel 0+8 t=1 runtime.memequal_varlen+0
runtime.memequal64·f SRODATA dupok size=8
0x0000 00 00 00 00 00 00 00 00                          ........
rel 0+8 t=1 runtime.memequal64+0
runtime.gcbits.0100000000000000 SRODATA dupok size=8
0x0000 01 00 00 00 00 00 00 00                          ........
type:.namedata.*[256]int32- SRODATA dupok size=13
0x0000 00 0b 2a 5b 32 35 36 5d 69 6e 74 33 32           ..*[256]int32
type:*[256]int32 SRODATA dupok size=56
0x0000 08 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00  ................
0x0010 5c eb 0a 2f 08 08 08 36 00 00 00 00 00 00 00 00  \../...6........
0x0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0x0030 00 00 00 00 00 00 00 00                          ........
rel 24+8 t=1 runtime.memequal64·f+0
rel 32+8 t=1 runtime.gcbits.0100000000000000+0
rel 40+4 t=5 type:.namedata.*[256]int32-+0
rel 48+8 t=1 type:[256]int32+0
runtime.gcbits. SRODATA dupok size=0
type:[256]int32 SRODATA dupok size=72
0x0000 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0x0010 1e 16 ae f5 0a 04 04 11 00 00 00 00 00 00 00 00  ................
0x0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0x0030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0x0040 00 01 00 00 00 00 00 00                          ........
rel 24+8 t=1 type:.eqfunc1024+0
rel 32+8 t=1 runtime.gcbits.+0
rel 40+4 t=5 type:.namedata.*[256]int32-+0
rel 44+4 t=-32763 type:*[256]int32+0
rel 48+8 t=1 type:int32+0
rel 56+8 t=1 type:[]int32+0
gclocals·g2BeySu+wFnoycgXfElmcg== SRODATA dupok size=8
0x0000 01 00 00 00 00 00 00 00                          ........

 

go tool objdump를 통해 디스어셈블 하고 vadd를 찾으면 먼가 나오는데

위에서 테스트한 코드가 아니라 다른 어셈블리 코드의 것이 나온다.

go tool objdump tt | grep -i vadd
  indexbyte_arm64.s:61 0x11cc4 4e24bc66 VADDP V4.B16, V3.B16, V6.B16
  indexbyte_arm64.s:62 0x11cc8 4e26bcc6 VADDP V6.B16, V6.B16, V6.B16
  indexbyte_arm64.s:82 0x11cfc 4ee6bcc6 VADDP V6.D2, V6.D2, V6.D2
  indexbyte_arm64.s:91 0x11d10 4e24bc66 VADDP V4.B16, V3.B16, V6.B16
  indexbyte_arm64.s:92 0x11d14 4e26bcc6 VADDP V6.B16, V6.B16, V6.B16

 

경로와 파일명만 보면 arm64용 배열에 대한 내부 변환 알고리즘 같긴한데..

Text file src/internal/bytealg/indexbyte_arm64.s

[링크 : https://tip.golang.org/src/internal/bytealg/indexbyte_arm64.s]

 

그래서 그냥 디스어셈블 하니 87만 라인?

$ aarch64-linux-gnu-objdump -d tt > t2
$ wc -l t2
87170 t2

 

vadd로 검색하면 하나도 안나온다 -_-

$ aarch64-linux-gnu-objdump -d tt | grep -i vadd
$

 

그래서 된다고 봐야 하나 말아야 하나..

 

 

+

일단 실행시간으로 비교!

$ cat neon.go 
package main

func main() {
add()
}

func add() {
cnt := 10000000
a := make([]int32, cnt)
b := make([]int32, cnt)
c := make([]int32, cnt)

i := 0
for i = 0; i < cnt; i++ {
b[i] = int32(i);
c[i] = int32(cnt - i);
}

for i = 0; i < cnt; i++ {
a[i] = b[i] + c[i]
}
}

 

위의 소스로 테스트를 해보니 arm64가 좀 빨라지긴 한데... 미묘하네

/// GOARCH=arm go build -gcflags -S .
# time ./tt

real    0m0.196s
user    0m0.161s
sys     0m0.036s
/// GOARCH=arm64 go build -gcflags -S .
# time ./tt.aarch64 

real    0m0.162s
user    0m0.087s
sys     0m0.075s

 

 

+

c로 하려는데

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 
  4 void main()
  5 {
  6         int cnt = 10000000;
  7         int *a,*b,*c;
  8         a = malloc(sizeof(int) * cnt);
  9         b = malloc(sizeof(int) * cnt);
 10         c = malloc(sizeof(int) * cnt);
 11 
 12         for(int i = 0; i < cnt; i++)
 13         {
 14                 b[i] = i;
 15                 c[i] = cnt - i;
 16         }
 17 
 18         for(int i = 0; i < cnt; i++)
 19         {
 20                 a[i] = b[i] + c[i];
 21         }
 22 
 23         printf("%d %d %d\n",a[0],b[0],c[0]);
 24 
 25         return 0;
 26 }

 

아무래도 printf가 없어서 계산은 하지만 사용하지 않는(출력이 없어서) 그냥 최적화 옵션에서 제외해버리니까

결과에 대해서만 출력하도록 두고 해보니

$ aarch64-poky-linux-gcc --sysroot=/opt/fsl-imx-wayland/5.15-kirkstone/sysroots/armv8a-poky-linux -march=armv8-a -O3 -fopt-info-vec neon.c
neon.c:18:19: optimized: loop vectorized using 16 byte vectors
neon.c:12:19: optimized: loop vectorized using 16 byte vectors

 

음.. 0.213s라.. go가 오히려 빠른가 싶었는데, user space로 보면 그래도 c가 빠르긴 한 듯.

# time ./a.out 
10000000 0 10000000

real    0m0.213s
user    0m0.076s
sys     0m0.135s

 

다시 출력을 추가해서

  1 package main
  2 
  3 import "fmt"
  4 
  5 func main() {
  6         add()
  7 }
  8 
  9 func add() {
 10         cnt := 10000000
 11         a := make([]int32, cnt)
 12         b := make([]int32, cnt)
 13         c := make([]int32, cnt)
 14 
 15         i := 0
 16         for i = 0; i < cnt; i++ {
 17                 b[i] = int32(i);
 18                 c[i] = int32(cnt - i);
 19         }
 20 
 21         for i = 0; i < cnt; i++ {
 22                 a[i] = b[i] + c[i]
 23         }
 24 
 25         fmt.Println("neon");
 26         fmt.Println(a[0], b[0], c[0])
 27 }

 

실행해보니 0.204s go가 조금 더 빠르다? 그런데 희한할 정도로 sys가 짧은 건 왜일까?

# time ./neon
neon
10000000 0 10000000

real    0m0.204s
user    0m0.179s
sys     0m0.025s

 

혹시나 해서 c로 짠걸 neon 옵션 빼고(-O3) 해보니 속도 상으로는 맞는 듯?

# time ./a.out.none
10000000 0 10000000

real    0m0.699s
user    0m0.550s
sys     0m0.144s

 

'Programming > golang' 카테고리의 다른 글

go packed struct  (0) 2023.09.01
golang asm  (0) 2023.08.24
golang echo 서버 이상한 버그 발견?  (0) 2023.06.27
go ws server client example  (0) 2023.06.08
golang waitgroup  (0) 2023.05.24
Posted by 구차니
이론 관련/전기 전자2023. 8. 23. 11:11

문서에 웬지 dBm 이런걸 넣으면 주옥될 느낌..

db는 log scale이라서 상대값이 아니었나? 싶어서 다시 찾아보는데

dBm 은 mili-watt 단위라는 실세계 단위랑 매칭이 되어야 한다.

 

dB란 말 자체는 어떤 값의 차이를 Log로 나타낸 (상대적) 스케일의 한 종류 입니다. 측정값 자체를 지칭하는 것이 아닙니다.

 

 dBm의 정의
그렇다면 dBm은 상대값인가? 아닙니다. dBm은 절대값입니다. dBm이란, mW 단위의 전력을 dB 스케일로 나타낸 단위 를 의미

[링크 : http://www.rfdh.com/bas_rf/begin/dbdbm.htm]

'이론 관련 > 전기 전자' 카테고리의 다른 글

아날로그 컴퓨터  (0) 2023.10.11
rc 시정수 계산  (0) 2023.10.05
역극성 보호  (0) 2023.08.01
유선 전화기 들면 들리는 소리  (0) 2023.07.25
envelope detection  (0) 2023.07.14
Posted by 구차니

Virtualized radio area network

intel에서 xeon에 넣어서 판다고 광고를 해대서 먼가~ 하고 찾아봄

radio area network라면서 5G 기지국을 만드는 것 처럼 보이는데, 일종의 SDR 가속 기능 같기도 하고...

 

[링크 : https://www.intel.com/content/www/us/en/products/docs/processors/network/4th-gen-xeon-scalable-vran.html]

 

Software-Defined Virtualized RAN (vRAN)
Radio Access Network (RAN) 

[링크 : https://www.parallelwireless.com/products/software-defined-virtualized-ran/]

 

'이론 관련 > 컴퓨터 관련' 카테고리의 다른 글

gps kalman  (0) 2024.03.13
db 식별/비식별 관계  (0) 2024.02.15
cordic (coordinate rotation digital computer)  (0) 2023.02.27
tlv  (0) 2022.10.19
DR - Disaster Recovery Plan  (0) 2022.10.17
Posted by 구차니

어우 외근이라 그런가..

저녁만 되면 기운이 없네

지하철에서도 골아떨어지고..

'개소리 왈왈 > 직딩의 비애' 카테고리의 다른 글

바쁜데 남은게 없는 느낌  (0) 2023.09.15
알뜰카드 도착, 앱 설치 완료!  (0) 2023.09.14
다이조아 부품 데이터 시트  (0) 2023.08.10
다이조아 택베도착  (0) 2023.08.09
오늘의 지름  (2) 2023.08.02
Posted by 구차니
하드웨어/Display 장비2023. 8. 21. 23:01

와.. 이게 되네?

 

 

7세대 노트북이라도 720p120은 단독으로 해야지

1080p60 + 720p120은 버거운지 싱크가 안맞거나 흔들린다.  cpu에 한계인지도?

 

아무튼 HDMI로도 되는걸 확인했으니 기대 만빵 ㅋ

Posted by 구차니
파일방2023. 8. 21. 12:37

hitran 데이터를 기반으로 흡수 정도를 혼합공기에 대해 시뮬레이션 해주는 툴.

 

[링크 : https://www.bytran.org/index.htm]

[링크 : https://www.bytran.org/downloads.htm]

[링크 : https://play.google.com/store/apps/details?id=org.bytran.bytran]

 

'파일방' 카테고리의 다른 글

flipper zero  (0) 2024.02.13
LVGL (Light and Versatile Graphics Library)  (0) 2023.11.18
kchmviewer  (0) 2023.06.14
barrier - fork of synergy  (0) 2023.01.02
fsn (fusion) - file system navigator  (0) 2022.08.26
Posted by 구차니
하드웨어/Display 장비2023. 8. 20. 22:47

 

검색하는데 잘 안나와서 일단 나오는대로 정리

 

ffmpeg을 이용하여 2개 파일을 합쳐서 번갈아 출력하는(L/R 순서 프레임) 동영상으로 만들기

[링크 : https://video.stackexchange.com/questions/28878/how-to-create-frame-sequential-alternate-frames-3d-video-from-two-separate-one]

 

avisynth로 프레임 번갈아 출력되는 동영상을 Side by Side 영상으로 변환하기

[링크 : https://forum.videohelp.com/threads/340028-How-to-convert-frame-sequential-3D-to-side-by-side-3D]

Posted by 구차니
하드웨어/Display 장비2023. 8. 20. 18:17

크흡.. 걍 윈도우 깔아야 하나.. 

HDMI는 신호 없음

RGB로 해야만 정상적으로(?) 120Hz 인식해서 3d 모드가 활성화 된다.

다만 리눅스에서 동영상을 재생할 방법을 모르겠고

이상하게 화면이 으깨져서 타이밍을 잘 못 넣어준게 아닌가 다른 설정값을 넣어야 하나 고민중..

그 와중에 윈도우에서 인텔 콘트롤 패널 까지 설치했는데도 사용자 해상도를 넣을수가 없어서 일단은... 포기해야 할 듯.

 

3세대 내장이라고 딱히 다를건 없다.

일단은 HDMI로 시도. RGB와는 다르게 extension block 찾았다고 생소한(?) 정보가 많이 보인다.

$ sudo get-edid
This is read-edid version 3.0.2. Prepare for some fun.
Attempting to use i2c interface
Problem requesting slave address: Device or resource busy
No EDID on bus 1
No EDID on bus 2
No EDID on bus 3
No EDID on bus 4
No EDID on bus 5
No EDID on bus 7
1 potential busses found: 6
256-byte EDID successfully retrieved from i2c bus 6
������ ��,%�x*���[V�%O]��E|a|a�����@�@� �Q 0H�6�0V\
      �BENQ
        �MP780ST
     d"�M� !"# �g
                  8-�R� �(U@�q X,%���r ,%���
Looks like i2c was successful. Have a good day.

$ parse-edid < /tmp/edid 
Checksum Correct

Section "Monitor"
Identifier "MP780ST"
ModelName "MP780ST"
VendorName "BNQ"
# Monitor Manufactured week 37 of 2010
# EDID version 1.3
# Digital Display
# Display Physical Size not given. Normal for projectors.
Gamma 2.20
Option "DPMS" "true"
Horizsync 31-92
VertRefresh 48-86
# Maximum pixel clock is 170MHz
#Not giving standard mode: 1280x720, 120Hz
#Not giving standard mode: 800x600, 120Hz
#Not giving standard mode: 1024x768, 120Hz
#Not giving standard mode: 1024x576, 60Hz
#Not giving standard mode: 1280x1024, 60Hz
#Not giving standard mode: 1440x900, 60Hz
#Not giving standard mode: 1400x1050, 60Hz
#Not giving standard mode: 1600x1200, 60Hz

#Extension block found. Parsing...
Modeline  "Mode 14" 74.25 1280 1720 1760 1980 720 725 730 750 +hsync +vsync 
Modeline  "Mode 0" 83.50 1280 1352 1480 1680 800 803 809 831 -hsync +vsync 
Modeline  "Mode 1" 148.500 1920 2448 2492 2640 1080 1084 1089 1125 +hsync +vsync
Modeline  "Mode 2" 148.500 1920 2008 2052 2200 1080 1084 1089 1125 +hsync +vsync
Modeline  "Mode 3" 27.027 720 736 798 858 480 489 495 525 -hsync -vsync
Modeline  "Mode 4" 74.250 1280 1390 1420 1650 720 725 730 750 +hsync +vsync
Modeline  "Mode 5" 74.250 1920 2008 2052 2200 1080 1082 1087 1125 +hsync +vsync interlace
Modeline  "Mode 6" 27.000 720 732 796 864 576 581 586 625 -hsync -vsync
Modeline  "Mode 7" 74.250 1280 1720 1760 1980 720 725 730 750 +hsync +vsync
Modeline  "Mode 8" 74.250 1920 2448 2492 2640 1080 1082 1089 1125 +hsync +vsync interlace
Modeline  "Mode 9" 27.027 720 736 798 858 480 489 495 525 -hsync -vsync
Modeline  "Mode 10" 27.000 720 732 796 864 576 581 586 625 -hsync -vsync
Modeline  "Mode 11" 74.250 1920 2558 2602 2750 1080 1084 1089 1125 +hsync +vsync
Modeline  "Mode 12" 74.250 1920 2448 2492 2640 1080 1084 1089 1125 +hsync +vsync
Modeline  "Mode 13" 74.250 1920 2008 2052 2200 1080 1084 1089 1125 +hsync +vsync
Modeline  "Mode 15" 74.25 1920 2008 2052 2200 540 542 547 562 +hsync +vsync interlace
Modeline  "Mode 16" 74.25 1920 2448 2492 2640 540 542 547 562 +hsync +vsync interlace
Modeline  "Mode 17" 27.00 720 736 798 858 480 489 495 525 -hsync -vsync 
Option "PreferredMode" "Mode 14"
EndSection

 

xrandr 한다고 해서 머.. 800p120이 나올거라고 생각은 안했지만..

정리하면서 보니 1280x720@120이 보이니 이걸로 다시 시도해보면 편할지도 모르겠다.

$ xrandr
Screen 0: minimum 320 x 200, current 1280 x 800, maximum 16384 x 16384
VGA-1 disconnected (normal left inverted right x axis y axis)
HDMI-1 connected primary 1280x800+0+0 (normal left inverted right x axis y axis) 0mm x 0mm
   1280x800      59.81*+
   1920x1080     60.00    50.00    59.94    30.00    25.00    24.00    29.97    23.98  
   1920x1080i    60.00    50.00    59.94  
   1600x1200     60.00  
   1400x1050     59.95  
   1280x1024     75.02    60.02  
   1440x900      59.90  
   1152x864      75.00  
   1280x720     119.99    60.00    56.98    50.00    59.94  
   1024x768     119.99    75.03    70.07    60.00  
   1024x576      59.97  
   832x624       74.55  
   800x600      119.97    72.19    75.00    60.32  
   720x576       50.00  
   720x480       60.00    59.94  
   640x480       75.00    72.81    66.67    60.00    59.94  
   720x400       70.08  
DP-1 disconnected (normal left inverted right x axis y axis)

 

귀찮아서(!) HDMI만 연결하고 RGB는 연결 안함.

$ xrandr --listmonitors
Monitors: 1
 0: +*HDMI-1 1280/339x800/212+0+0  HDMI-1

 

해상도를 HDMI로 추가하고

$ cvt 1280 800 120
# 1280x800 119.85 Hz (CVT) hsync: 103.07 kHz; pclk: 179.75 MHz
Modeline "1280x800_120.00"  179.75  1280 1376 1512 1744  800 803 809 860 -hsync +vsync

$ xrandr --newmode "1280x800_120.00"  179.75  1280 1376 1512 1744  800 803 809 860 -hsync +vsync
$ xrandr --addmode HDMI-1 "1280x800_120.00"

 

설정에서 뜨긴 한데, 정작 적용하면 신호가 없다고 나온다.

 

다시 RGB에 추가시도

그러고 보니.. 왜 1280x720@120 보다 1280x800@120이 더 클럭이 낮냐?

$ xrandr
Screen 0: minimum 320 x 200, current 2560 x 800, maximum 16384 x 16384
VGA-1 connected 1280x800+1280+0 (normal left inverted right x axis y axis) 0mm x 0mm
   1280x800      59.81*+
   1600x1200     60.00  
   1400x1050     59.98  
   1280x1024     75.02    60.02  
   1440x900      59.89  
   1152x864      75.00  
   1280x720     119.99  
   1024x768     120.05    75.03    70.07    60.00  
   1024x576      59.97  
   832x624       74.55  
   800x600      120.09    72.19    75.00    60.32  
   640x480       75.00    72.81    66.67    59.94  
   720x400       70.08  
   1280x800_120.00 119.85  
HDMI-1 connected primary 1280x800+0+0 (normal left inverted right x axis y axis) 0mm x 0mm
   1280x800      59.81*+
   1920x1080     60.00    50.00    59.94    30.00    25.00    24.00    29.97    23.98  
   1920x1080i    60.00    50.00    59.94  
   1600x1200     60.00  
   1400x1050     59.95  
   1280x1024     75.02    60.02  
   1440x900      59.90  
   1152x864      75.00  
   1280x720     119.99    60.00    56.98    50.00    59.94  
   1024x768     119.99    75.03    70.07    60.00  
   1024x576      59.97  
   832x624       74.55  
   800x600      119.97    72.19    75.00    60.32  
   720x576       50.00  
   720x480       60.00    59.94  
   640x480       75.00    72.81    66.67    60.00    59.94  
   720x400       70.08  
   1280x800_120.00 119.85  
DP-1 disconnected (normal left inverted right x axis y axis)

 

요건 1280x800@60 일때. 깨끗하다.

 

1280x800@120 오른쪽 콘솔을 보면 글씨가 엄청 으깨진다. 출력단의 문제인 듯. 캡쳐하면 깨끗하게 나온다.

 

연구소에서 사둔 3d 셔터글래스를 빌려와서 테스트

 

3d 안경을 버튼 눌러서 작동하게 하고 보면 좀 어두운데

 

미간 사이를 손가락으로 가려서 센서를 막은 다음에 보면 약간은 밝게 보인다.

마우스를 움직이면 프레임 차이로 인해서 마우스가 화면을 파고 들어가는 것 처럼 보여서 어지러운데

어떻게 조정이 가능한게 아니라 리눅스 상에서 쓸 수 있을지는 좀 더 고민해 봐야 할 듯.

Posted by 구차니