v8でjsとwasmのアセンブリを取る方法
どうも、こんにちは、UMASHIBAです
研究でjsとwasmのアセンブリを取る必要があったのでしばらくの間その作業をしてました。ようやくjsもwasmもアセンブリをとることができたのでやり方を記述します。
自分はあまり低レイヤに詳しい人間ではないので他にも方法があるかもしれません。知っている方は本当に知りたいので何卒教えてください。よろしくお願いします🙇♂️
アセンブリの基本的な取り方
基本的にv8 engineで吐き出されるアセンブリを取る際は--print-code
オプションを使用します。
このフラグはnodeでもv8の開発者用shellであるd8でも実行できます。(v8のオプションをnodeでも使ってるという感じです。)
例
node --print-code sample.js
d8 --print-code sample.js
※d8のインストール方法については下のスクラップとかブログとかを参考にして各自のPCに入れてください。
日本語で書いたスクラップ
v8の公式ブログ(おすすめ)
jsのアセンブリの取り方
まずはjsのアセンブリの取り方についてです。
これは結構簡単です。
- jsファイルを作ります。
touch index.js
- コードを書きます。
const fib = function (n) {
if (n <= 1) {
return n;
}
return fib(n - 1) + fib(n - 2);
};
for (let i = 0; i < 10; i++) {
fib(40);
}
- アセンブリをとります。
node --print-code index.js > sample.asm
or
d8 --print-code index.js > sample.asm
--print-code
はアセンブリを取るためのv8のフラグです。
これでjsのアセンブリを取ることができます。
jsのアセンブリ(長いので折り畳んでます)
--- Raw source ---
(n) {
if (n <= 1) {
return n;
}
return fib(n - 1) + fib(n - 2);
};
--- Optimized code ---
optimization_id = 0
source_position = 21
kind = TURBOFAN
name = fib
stack_slots = 9
compiler = turbofan
address = 0x2b18008c4001
Instructions (size = 796)
0x2b18008c4040 0 488d1df9ffffff REX.W leaq rbx,[rip+0xfffffff9]
0x2b18008c4047 7 483bd9 REX.W cmpq rbx,rcx
0x2b18008c404a a 740a jz 0x2b18008c4056 <+0x16>
0x2b18008c404c c 33d2 xorl rdx,rdx
0x2b18008c404e e b270 movb dl,70
0x2b18008c4050 10 e84b6286ff call 0x2b180012a2a0 (Abort) ;; runtime entry
0x2b18008c4055 15 cc int3l
0x2b18008c4056 16 8b59d0 movl rbx,[rcx-0x30]
0x2b18008c4059 19 4903de REX.W addq rbx,r14
0x2b18008c405c 1c f6430701 testb [rbx+0x7],0x1
0x2b18008c4060 20 7405 jz 0x2b18008c4067 <+0x27>
0x2b18008c4062 22 e9b9ec77ff jmp 0x2b1800042d20 (CompileLazyDeoptimizedCode) ;; runtime entry
0x2b18008c4067 27 55 push rbp
0x2b18008c4068 28 4889e5 REX.W movq rbp,rsp
0x2b18008c406b 2b 56 push rsi
0x2b18008c406c 2c 57 push rdi
0x2b18008c406d 2d 50 push rax
0x2b18008c406e 2e 4883ec20 REX.W subq rsp,0x20
0x2b18008c4072 32 488975e0 REX.W movq [rbp-0x20],rsi
0x2b18008c4076 36 493b6560 REX.W cmpq rsp,[r13+0x60] (external value (StackGuard::address_of_jslimit()))
0x2b18008c407a 3a 0f8633010000 jna 0x2b18008c41b3 <+0x173>
0x2b18008c4080 40 488b4518 REX.W movq rax,[rbp+0x18]
0x2b18008c4084 44 a801 test al,0x1
0x2b18008c4086 46 0f858e020000 jnz 0x2b18008c431a <+0x2da>
0x2b18008c408c 4c 83f802 cmpl rax,0x2
0x2b18008c408f 4f 0f8e1c010000 jle 0x2b18008c41b1 <+0x171>
0x2b18008c4095 55 488bc8 REX.W movq rcx,rax
0x2b18008c4098 58 d1f9 sarl rcx, 1
0x2b18008c409a 5a 4c8bc1 REX.W movq r8,rcx
0x2b18008c409d 5d 4183e801 subl r8,0x1
0x2b18008c40a1 61 0f807a020000 jo 0x2b18008c4321 <+0x2e1>
0x2b18008c40a7 67 48bfe58f1008182b0000 REX.W movq rdi,0x2b1808108fe5 ;; object: 0x2b1808108fe5 <JSFunction fib (sfi = 0x2b1808292d71)>
0x2b18008c40b1 71 8b770f movl rsi,[rdi+0xf]
0x2b18008c40b4 74 4903f6 REX.W addq rsi,r14
0x2b18008c40b7 77 48894dd0 REX.W movq [rbp-0x30],rcx
0x2b18008c40bb 7b 4d8bc8 REX.W movq r9,r8
0x2b18008c40be 7e 4503c8 addl r9,r8
0x2b18008c40c1 81 0f8014010000 jo 0x2b18008c41db <+0x19b>
0x2b18008c40c7 87 4151 push r9
0x2b18008c40c9 89 49b80d342808182b0000 REX.W movq r8,0x2b180828340d ;; object: 0x2b180828340d <JSGlobal Object>
0x2b18008c40d3 93 4150 push r8
0x2b18008c40d5 95 498b95a0000000 REX.W movq rdx,[r13+0xa0] (root (undefined_value))
0x2b18008c40dc 9c b801000000 movl rax,0x1
0x2b18008c40e1 a1 3b770f cmpl rsi,[rdi+0xf]
0x2b18008c40e4 a4 740a jz 0x2b18008c40f0 <+0xb0>
0x2b18008c40e6 a6 33d2 xorl rdx,rdx
0x2b18008c40e8 a8 b272 movb dl,72
0x2b18008c40ea aa e8b16186ff call 0x2b180012a2a0 (Abort) ;; runtime entry
0x2b18008c40ef af cc int3l
0x2b18008c40f0 b0 8b4f17 movl rcx,[rdi+0x17]
0x2b18008c40f3 b3 4903ce REX.W addq rcx,r14
0x2b18008c40f6 b6 4883c13f REX.W addq rcx,0x3f
0x2b18008c40fa ba ffd1 call rcx
0x2b18008c40fc bc 488945d8 REX.W movq [rbp-0x28],rax
0x2b18008c4100 c0 488b4dd0 REX.W movq rcx,[rbp-0x30]
0x2b18008c4104 c4 83e902 subl rcx,0x2
0x2b18008c4107 c7 0f801b020000 jo 0x2b18008c4328 <+0x2e8>
0x2b18008c410d cd 48bfe58f1008182b0000 REX.W movq rdi,0x2b1808108fe5 ;; object: 0x2b1808108fe5 <JSFunction fib (sfi = 0x2b1808292d71)>
0x2b18008c4117 d7 8b770f movl rsi,[rdi+0xf]
0x2b18008c411a da 4903f6 REX.W addq rsi,r14
0x2b18008c411d dd 4c8bc1 REX.W movq r8,rcx
0x2b18008c4120 e0 4403c1 addl r8,rcx
0x2b18008c4123 e3 0f8027010000 jo 0x2b18008c4250 <+0x210>
0x2b18008c4129 e9 4150 push r8
0x2b18008c412b eb 48b90d342808182b0000 REX.W movq rcx,0x2b180828340d ;; object: 0x2b180828340d <JSGlobal Object>
0x2b18008c4135 f5 51 push rcx
0x2b18008c4136 f6 b801000000 movl rax,0x1
0x2b18008c413b fb 498b95a0000000 REX.W movq rdx,[r13+0xa0] (root (undefined_value))
0x2b18008c4142 102 3b770f cmpl rsi,[rdi+0xf]
0x2b18008c4145 105 740a jz 0x2b18008c4151 <+0x111>
0x2b18008c4147 107 33d2 xorl rdx,rdx
0x2b18008c4149 109 b272 movb dl,72
0x2b18008c414b 10b e8506186ff call 0x2b180012a2a0 (Abort) ;; runtime entry
0x2b18008c4150 110 cc int3l
0x2b18008c4151 111 8b4f17 movl rcx,[rdi+0x17]
0x2b18008c4154 114 4903ce REX.W addq rcx,r14
0x2b18008c4157 117 4883c13f REX.W addq rcx,0x3f
0x2b18008c415b 11b ffd1 call rcx
0x2b18008c415d 11d 488b4dd8 REX.W movq rcx,[rbp-0x28]
0x2b18008c4161 121 f6c101 testb rcx,0x1
0x2b18008c4164 124 0f85c5010000 jnz 0x2b18008c432f <+0x2ef>
0x2b18008c416a 12a a801 test al,0x1
0x2b18008c416c 12c 0f85c4010000 jnz 0x2b18008c4336 <+0x2f6>
0x2b18008c4172 132 4c8bc0 REX.W movq r8,rax
0x2b18008c4175 135 41d1f8 sarl r8, 1
0x2b18008c4178 138 4c8bc9 REX.W movq r9,rcx
0x2b18008c417b 13b 41d1f9 sarl r9, 1
0x2b18008c417e 13e 4503c1 addl r8,r9
0x2b18008c4181 141 0f80b6010000 jo 0x2b18008c433d <+0x2fd>
0x2b18008c4187 147 498bc8 REX.W movq rcx,r8
0x2b18008c418a 14a 4103c8 addl rcx,r8
0x2b18008c418d 14d 0f8029010000 jo 0x2b18008c42bc <+0x27c>
0x2b18008c4193 153 488bc1 REX.W movq rax,rcx
0x2b18008c4196 156 488b4de8 REX.W movq rcx,[rbp-0x18]
0x2b18008c419a 15a 488be5 REX.W movq rsp,rbp
0x2b18008c419d 15d 5d pop rbp
0x2b18008c419e 15e 4883f901 REX.W cmpq rcx,0x1
0x2b18008c41a2 162 7f03 jg 0x2b18008c41a7 <+0x167>
0x2b18008c41a4 164 c21000 ret 0x10
0x2b18008c41a7 167 415a pop r10
0x2b18008c41a9 169 488d64cc08 REX.W leaq rsp,[rsp+rcx*8+0x8]
0x2b18008c41ae 16e 4152 push r10
0x2b18008c41b0 170 c3 retl
0x2b18008c41b1 171 ebe3 jmp 0x2b18008c4196 <+0x156>
0x2b18008c41b3 173 33c9 xorl rcx,rcx
0x2b18008c41b5 175 b140 movb cl,40
0x2b18008c41b7 177 51 push rcx
0x2b18008c41b8 178 b801000000 movl rax,0x1
0x2b18008c41bd 17d 48bb1061ee0e01000000 REX.W movq rbx,0x10eee6110 ;; external reference (Runtime::StackGuardWithGap)
0x2b18008c41c7 187 48be1d342808182b0000 REX.W movq rsi,0x2b180828341d ;; object: 0x2b180828341d <NativeContext[255]>
0x2b18008c41d1 191 e84ae1a6ff call 0x2b1800332320 (CEntry_Return1_DontSaveFPRegs_ArgvOnStack_NoBuiltinExit) ;; runtime entry
0x2b18008c41d6 196 e9a5feffff jmp 0x2b18008c4080 <+0x40>
0x2b18008c41db 19b 4d8b8db8df3f1e REX.W movq r9,[r13+0x1e3fdfb8]
0x2b18008c41e2 1a2 4d8d590c REX.W leaq r11,[r9+0xc]
0x2b18008c41e6 1a6 488975d8 REX.W movq [rbp-0x28],rsi
0x2b18008c41ea 1aa 4c8945c8 REX.W movq [rbp-0x38],r8
0x2b18008c41ee 1ae 4d399dc0df3f1e REX.W cmpq [r13+0x1e3fdfc0],r11
0x2b18008c41f5 1b5 0f8727000000 ja 0x2b18008c4222 <+0x1e2>
0x2b18008c41fb 1bb 33d2 xorl rdx,rdx
0x2b18008c41fd 1bd b20c movb dl,c
0x2b18008c41ff 1bf e8bc0278ff call 0x2b18000444c0 (AllocateRegularInYoungGeneration) ;; runtime entry
0x2b18008c4204 1c4 4c8d48ff REX.W leaq r9,[rax-0x1]
0x2b18008c4208 1c8 4c8b45c8 REX.W movq r8,[rbp-0x38]
0x2b18008c420c 1cc 488b4518 REX.W movq rax,[rbp+0x18]
0x2b18008c4210 1d0 48bfe58f1008182b0000 REX.W movq rdi,0x2b1808108fe5 ;; object: 0x2b1808108fe5 <JSFunction fib (sfi = 0x2b1808292d71)>
0x2b18008c421a 1da 488b4dd0 REX.W movq rcx,[rbp-0x30]
0x2b18008c421e 1de 488b75d8 REX.W movq rsi,[rbp-0x28]
0x2b18008c4222 1e2 4d8d590c REX.W leaq r11,[r9+0xc]
0x2b18008c4226 1e6 4d899db8df3f1e REX.W movq [r13+0x1e3fdfb8],r11
0x2b18008c422d 1ed 4983c101 REX.W addq r9,0x1
0x2b18008c4231 1f1 4d8b9d40010000 REX.W movq r11,[r13+0x140] (root (heap_number_map))
0x2b18008c4238 1f8 458959ff movl [r9-0x1],r11
0x2b18008c423c 1fc 660f57c0 xorpd xmm0,xmm0
0x2b18008c4240 200 f2410f2ac0 cvtsi2sd xmm0,r8
0x2b18008c4245 205 f2410f114103 movsd [r9+0x3],xmm0
0x2b18008c424b 20b e977feffff jmp 0x2b18008c40c7 <+0x87>
0x2b18008c4250 210 4d8b85b8df3f1e REX.W movq r8,[r13+0x1e3fdfb8]
0x2b18008c4257 217 4d8d480c REX.W leaq r9,[r8+0xc]
0x2b18008c425b 21b 488975d0 REX.W movq [rbp-0x30],rsi
0x2b18008c425f 21f 48894dc8 REX.W movq [rbp-0x38],rcx
0x2b18008c4263 223 4d398dc0df3f1e REX.W cmpq [r13+0x1e3fdfc0],r9
0x2b18008c426a 22a 0f871f000000 ja 0x2b18008c428f <+0x24f>
0x2b18008c4270 230 33d2 xorl rdx,rdx
0x2b18008c4272 232 b20c movb dl,c
0x2b18008c4274 234 e8470278ff call 0x2b18000444c0 (AllocateRegularInYoungGeneration) ;; runtime entry
0x2b18008c4279 239 4c8d40ff REX.W leaq r8,[rax-0x1]
0x2b18008c427d 23d 488b4dc8 REX.W movq rcx,[rbp-0x38]
0x2b18008c4281 241 48bfe58f1008182b0000 REX.W movq rdi,0x2b1808108fe5 ;; object: 0x2b1808108fe5 <JSFunction fib (sfi = 0x2b1808292d71)>
0x2b18008c428b 24b 488b75d0 REX.W movq rsi,[rbp-0x30]
0x2b18008c428f 24f 4d8d480c REX.W leaq r9,[r8+0xc]
0x2b18008c4293 253 4d898db8df3f1e REX.W movq [r13+0x1e3fdfb8],r9
0x2b18008c429a 25a 4983c001 REX.W addq r8,0x1
0x2b18008c429e 25e 4d8b8d40010000 REX.W movq r9,[r13+0x140] (root (heap_number_map))
0x2b18008c42a5 265 458948ff movl [r8-0x1],r9
0x2b18008c42a9 269 660f57c0 xorpd xmm0,xmm0
0x2b18008c42ad 26d f20f2ac1 cvtsi2sd xmm0,rcx
0x2b18008c42b1 271 f2410f114003 movsd [r8+0x3],xmm0
0x2b18008c42b7 277 e96dfeffff jmp 0x2b18008c4129 <+0xe9>
0x2b18008c42bc 27c 498b8db8df3f1e REX.W movq rcx,[r13+0x1e3fdfb8]
0x2b18008c42c3 283 4c8d490c REX.W leaq r9,[rcx+0xc]
0x2b18008c42c7 287 4c8945e0 REX.W movq [rbp-0x20],r8
0x2b18008c42cb 28b 4d398dc0df3f1e REX.W cmpq [r13+0x1e3fdfc0],r9
0x2b18008c42d2 292 0f8711000000 ja 0x2b18008c42e9 <+0x2a9>
0x2b18008c42d8 298 33d2 xorl rdx,rdx
0x2b18008c42da 29a b20c movb dl,c
0x2b18008c42dc 29c e8df0178ff call 0x2b18000444c0 (AllocateRegularInYoungGeneration) ;; runtime entry
0x2b18008c42e1 2a1 488d48ff REX.W leaq rcx,[rax-0x1]
0x2b18008c42e5 2a5 4c8b45e0 REX.W movq r8,[rbp-0x20]
0x2b18008c42e9 2a9 4c8d490c REX.W leaq r9,[rcx+0xc]
0x2b18008c42ed 2ad 4d898db8df3f1e REX.W movq [r13+0x1e3fdfb8],r9
0x2b18008c42f4 2b4 4883c101 REX.W addq rcx,0x1
0x2b18008c42f8 2b8 4d8b8d40010000 REX.W movq r9,[r13+0x140] (root (heap_number_map))
0x2b18008c42ff 2bf 448949ff movl [rcx-0x1],r9
0x2b18008c4303 2c3 660f57c0 xorpd xmm0,xmm0
0x2b18008c4307 2c7 f2410f2ac0 cvtsi2sd xmm0,r8
0x2b18008c430c 2cc f20f114103 movsd [rcx+0x3],xmm0
0x2b18008c4311 2d1 488bc1 REX.W movq rax,rcx
0x2b18008c4314 2d4 e97dfeffff jmp 0x2b18008c4196 <+0x156>
0x2b18008c4319 2d9 90 nop
0x2b18008c431a 2da 41ff9580390000 call [r13+0x3980]
0x2b18008c4321 2e1 41ff9580390000 call [r13+0x3980]
0x2b18008c4328 2e8 41ff9580390000 call [r13+0x3980]
0x2b18008c432f 2ef 41ff9580390000 call [r13+0x3980]
0x2b18008c4336 2f6 41ff9580390000 call [r13+0x3980]
0x2b18008c433d 2fd 41ff9580390000 call [r13+0x3980]
0x2b18008c4344 304 41ff9598390000 call [r13+0x3998]
0x2b18008c434b 30b 41ff9598390000 call [r13+0x3998]
0x2b18008c4352 312 41ff9598390000 call [r13+0x3998]
0x2b18008c4359 319 0f1f00 nop
Source positions:
pc offset position
87 21
Inlined functions (count = 0)
Deoptimization Input Data (deopt points = 9)
index bytecode-offset pc
0 2 NA
1 2 NA
2 33 NA
3 41 NA
4 41 NA
5 41 NA
6 21 bc
7 37 11d
8 -1 196
Safepoints (size = 86)
0x2b18008c40fc bc 304 00010000 (sp -> fp) 6
0x2b18008c415d 11d 30b 00110000 (sp -> fp) 7
0x2b18008c41d6 196 312 00010000 (sp -> fp) 8
0x2b18008c4204 1c4 NA 00110000 (sp -> fp) <none>
0x2b18008c4279 239 NA 01110000 (sp -> fp) <none>
0x2b18008c42e1 2a1 NA 00000000 (sp -> fp) <none>
RelocInfo (size = 33)
0x2b18008c4051 runtime entry
0x2b18008c4063 runtime entry
0x2b18008c40a9 full embedded object (0x2b1808108fe5 <JSFunction fib (sfi = 0x2b1808292d71)>)
0x2b18008c40cb full embedded object (0x2b180828340d <JSGlobal Object>)
0x2b18008c40eb runtime entry
0x2b18008c410f full embedded object (0x2b1808108fe5 <JSFunction fib (sfi = 0x2b1808292d71)>)
0x2b18008c412d full embedded object (0x2b180828340d <JSGlobal Object>)
0x2b18008c414c runtime entry
0x2b18008c41bf external reference (Runtime::StackGuardWithGap) (0x10eee6110)
0x2b18008c41c9 full embedded object (0x2b180828341d <NativeContext[255]>)
0x2b18008c41d2 runtime entry
0x2b18008c4200 runtime entry
0x2b18008c4212 full embedded object (0x2b1808108fe5 <JSFunction fib (sfi = 0x2b1808292d71)>)
0x2b18008c4275 runtime entry
0x2b18008c4283 full embedded object (0x2b1808108fe5 <JSFunction fib (sfi = 0x2b1808292d71)>)
0x2b18008c42dd runtime entry
--- End code ---
※jsについてはnodeで--print-codeしてもアセンブリを簡単に取ることができます。nodeで--print-codeした場合はNode.js内のjsもアセンブリとして表示されるのか、何万行もアセンブリが出てきますが、丁寧なことにjsのアセンブリはRaw sourceという項目でjsのコードとアセンブリの対応づけをしてくれているのでどれが2.のコードのアセンブリなのかわかるようになってます。
wasmのアセンブリの取り方
※wasmのアセンブリはd8で取ることをお勧めします。nodeでも取れないことはないですが数万行のアセンブリが吐き出されどれが自分が書いたwasmのアセンブリなのかのヒントも少ないです。おそらくですけど数万行の中から自分のコードのアセンブリを探すよりもd8の環境を構築してアセンブリを取る方がはやいと思います。
wasmのアセンブリを取るにあたって使うものは下の二つです。
- wasm-pack
- wasmを生成するのに使います
- d8
- アセンブリを取るのに使います
wasm-packについては以下のサイトを参考にインストールとプロジェクトの生成をしてください。
さて、本題のアセンブリの取り方についてです。
- src/lib.rs内にコードを書きます。
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
pub fn fib(n: i32) -> i32 {
if n <= 1 {
return n
}
fib(n - 1) + fib(n - 2)
}
- wasm-packでプロジェクトをbuildします。ターゲットはnodejs、releaseオプションで最適化をかけます
wasm-pack build --target=nodejs --release
これでpkgフォルダ内に以下のような名前のwasmファイルが生成されます
rust_webpack_template_bg.wasm
- wasmをjsで読み込みます。
js/index.jsなどのjsファイルでwasmの呼び出しをします。呼び出しのコードは以下のようになるはずです
const buf = read('pkg/rust_webpack_template_bg.wasm', 'binary');
WebAssembly.instantiate(buf).then((wasm) => {
const {fib} = wasm.instance.exports;
for (let i = 0; i < 10; i++){
fib(40)
}
},
(error) => console.log(error));
readはv8で使えるファイルを読むためのメソッドです。
このreadはindex.js
からではなくd8を実行するディレクトリからの相対ぱすなので注意しましょう!(上のコードはwasm-packプロジェクト直下のディレクトリでd8を実行する想定)
- d8でアセンブリをとります。
d8 --print-wasm-code js/index.js > wasm-sample.asm
--print-wasm-code
はwasmのアセンブリを取るためのv8のフラグです。
これでwasmのアセンブリが取れます。
wasmのアセンブリ(長いので折り畳んでます。)
--- WebAssembly code ---
index: 0
kind: wasm function
compiler: Liftoff
Body (size = 288 = 272 + 16 padding)
Instructions (size = 252)
0x2d706a6ac440 0 55 push rbp
0x2d706a6ac441 1 4889e5 REX.W movq rbp,rsp
0x2d706a6ac444 4 6a08 push 0x8
0x2d706a6ac446 6 4881ec28000000 REX.W subq rsp,0x28
0x2d706a6ac44d d 488975f0 REX.W movq [rbp-0x10],rsi
0x2d706a6ac451 11 488b4e23 REX.W movq rcx,[rsi+0x23]
0x2d706a6ac455 15 483b21 REX.W cmpq rsp,[rcx]
0x2d706a6ac458 18 0f86be000000 jna 0x2d706a6ac51c <+0xdc>
0x2d706a6ac45e 1e b902000000 movl rcx,0x2
0x2d706a6ac463 23 3bc1 cmpl rax,rcx
0x2d706a6ac465 25 0f9cc1 setll cl
0x2d706a6ac468 28 0fb6c9 movzxbl rcx,rcx
0x2d706a6ac46b 2b 85c9 testl rcx,rcx
0x2d706a6ac46d 2d 0f840b000000 jz 0x2d706a6ac47e <+0x3e>
0x2d706a6ac473 33 8bd0 movl rdx,rax
0x2d706a6ac475 35 33c9 xorl rcx,rcx
0x2d706a6ac477 37 33db xorl rbx,rbx
0x2d706a6ac479 39 e96d000000 jmp 0x2d706a6ac4eb <+0xab>
0x2d706a6ac47e 3e 8945e4 movl [rbp-0x1c],rax
0x2d706a6ac481 41 c745e000000000 movl [rbp-0x20],0x0
0x2d706a6ac488 48 c745dc00000000 movl [rbp-0x24],0x0
0x2d706a6ac48f 4f c745d800000000 movl [rbp-0x28],0x0
0x2d706a6ac496 56 488b4623 REX.W movq rax,[rsi+0x23]
0x2d706a6ac49a 5a 483b20 REX.W cmpq rsp,[rax]
0x2d706a6ac49d 5d 0f8689000000 jna 0x2d706a6ac52c <+0xec>
0x2d706a6ac4a3 63 8b45e4 movl rax,[rbp-0x1c]
0x2d706a6ac4a6 66 83c0ff addl rax,0xff
0x2d706a6ac4a9 69 488b75f0 REX.W movq rsi,[rbp-0x10]
0x2d706a6ac4ad 6d e84efbffff call 0x2d706a6ac000
0x2d706a6ac4b2 72 8b4de0 movl rcx,[rbp-0x20]
0x2d706a6ac4b5 75 03c1 addl rax,rcx
0x2d706a6ac4b7 77 8b4de4 movl rcx,[rbp-0x1c]
0x2d706a6ac4ba 7a ba03000000 movl rdx,0x3
0x2d706a6ac4bf 7f 3bca cmpl rcx,rdx
0x2d706a6ac4c1 81 0f9fc1 setgl cl
0x2d706a6ac4c4 84 0fb6c9 movzxbl rcx,rcx
0x2d706a6ac4c7 87 8b55e4 movl rdx,[rbp-0x1c]
0x2d706a6ac4ca 8a 83c2fe addl rdx,0xfe
0x2d706a6ac4cd 8d 85c9 testl rcx,rcx
0x2d706a6ac4cf 8f 0f840f000000 jz 0x2d706a6ac4e4 <+0xa4>
0x2d706a6ac4d5 95 8955e4 movl [rbp-0x1c],rdx
0x2d706a6ac4d8 98 8945e0 movl [rbp-0x20],rax
0x2d706a6ac4db 9b 8955dc movl [rbp-0x24],rdx
0x2d706a6ac4de 9e 488b75f0 REX.W movq rsi,[rbp-0x10]
0x2d706a6ac4e2 a2 ebb2 jmp 0x2d706a6ac496 <+0x56>
0x2d706a6ac4e4 a4 8bc8 movl rcx,rax
0x2d706a6ac4e6 a6 8bc2 movl rax,rdx
0x2d706a6ac4e8 a8 8b5dd8 movl rbx,[rbp-0x28]
0x2d706a6ac4eb ab 8d3411 leal rsi,[rcx+rdx*1]
0x2d706a6ac4ee ae 8bc6 movl rax,rsi
0x2d706a6ac4f0 b0 48837df808 REX.W cmpq [rbp-0x8],0x8
0x2d706a6ac4f5 b5 7420 jz 0x2d706a6ac517 <+0xd7>
0x2d706a6ac4f7 b7 bf25000000 movl rdi,0x25
0x2d706a6ac4fc bc 4989e2 REX.W movq r10,rsp
0x2d706a6ac4ff bf 4883ec08 REX.W subq rsp,0x8
0x2d706a6ac503 c3 4883e4f0 REX.W andq rsp,0xf0
0x2d706a6ac507 c7 4c891424 REX.W movq [rsp],r10
0x2d706a6ac50b cb 48b820cc7e0b01000000 REX.W movq rax,0x10b7ecc20
0x2d706a6ac515 d5 ffd0 call rax
0x2d706a6ac517 d7 488be5 REX.W movq rsp,rbp
0x2d706a6ac51a da 5d pop rbp
0x2d706a6ac51b db c3 retl
0x2d706a6ac51c dc 50 push rax
0x2d706a6ac51d dd e88efdffff call 0x2d706a6ac2b0
0x2d706a6ac522 e2 58 pop rax
0x2d706a6ac523 e3 488b75f0 REX.W movq rsi,[rbp-0x10]
0x2d706a6ac527 e7 e932ffffff jmp 0x2d706a6ac45e <+0x1e>
0x2d706a6ac52c ec e87ffdffff call 0x2d706a6ac2b0
0x2d706a6ac531 f1 488b75f0 REX.W movq rsi,[rbp-0x10]
0x2d706a6ac535 f5 e969ffffff jmp 0x2d706a6ac4a3 <+0x63>
0x2d706a6ac53a fa 6690 nop
Source positions:
pc offset position
6d 26 statement
dd 0 statement
ec 19 statement
Safepoints (size = 20)
0x2d716a6ac43fffffffff (sp -> fp)
RelocInfo (size = 0)
--- End code ---
--- WebAssembly code ---
index: 1
kind: wasm function
compiler: Liftoff
Body (size = 128 = 120 + 8 padding)
Instructions (size = 100)
0x2d706a6ac560 0 55 push rbp
0x2d706a6ac561 1 4889e5 REX.W movq rbp,rsp
0x2d706a6ac564 4 6a08 push 0x8
0x2d706a6ac566 6 4881ec18000000 REX.W subq rsp,0x18
0x2d706a6ac56d d 488975f0 REX.W movq [rbp-0x10],rsi
0x2d706a6ac571 11 488b4e23 REX.W movq rcx,[rsi+0x23]
0x2d706a6ac575 15 483b21 REX.W cmpq rsp,[rcx]
0x2d706a6ac578 18 0f8638000000 jna 0x2d706a6ac5b6 <+0x56>
0x2d706a6ac57e 1e 8945e4 movl [rbp-0x1c],rax
0x2d706a6ac581 21 488b75f0 REX.W movq rsi,[rbp-0x10]
0x2d706a6ac585 25 e876faffff call 0x2d706a6ac000
0x2d706a6ac58a 2a 48837df808 REX.W cmpq [rbp-0x8],0x8
0x2d706a6ac58f 2f 7420 jz 0x2d706a6ac5b1 <+0x51>
0x2d706a6ac591 31 bf25000000 movl rdi,0x25
0x2d706a6ac596 36 4989e2 REX.W movq r10,rsp
0x2d706a6ac599 39 4883ec08 REX.W subq rsp,0x8
0x2d706a6ac59d 3d 4883e4f0 REX.W andq rsp,0xf0
0x2d706a6ac5a1 41 4c891424 REX.W movq [rsp],r10
0x2d706a6ac5a5 45 48b820cc7e0b01000000 REX.W movq rax,0x10b7ecc20
0x2d706a6ac5af 4f ffd0 call rax
0x2d706a6ac5b1 51 488be5 REX.W movq rsp,rbp
0x2d706a6ac5b4 54 5d pop rbp
0x2d706a6ac5b5 55 c3 retl
0x2d706a6ac5b6 56 50 push rax
0x2d706a6ac5b7 57 e8f4fcffff call 0x2d706a6ac2b0
0x2d706a6ac5bc 5c 58 pop rax
0x2d706a6ac5bd 5d 488b75f0 REX.W movq rsi,[rbp-0x10]
0x2d706a6ac5c1 61 ebbb jmp 0x2d706a6ac57e <+0x1e>
0x2d706a6ac5c3 63 90 nop
Source positions:
pc offset position
25 3 statement
57 0 statement
Safepoints (size = 20)
0x2d716a6ac55fffffffff (sp -> fp)
RelocInfo (size = 0)
--- End code ---
--- WebAssembly code ---
index: 0
kind: wasm function
compiler: TurboFan
Body (size = 384 = 364 + 20 padding)
Instructions (size = 344)
0x2d706a6ac640 0 55 push rbp
0x2d706a6ac641 1 4889e5 REX.W movq rbp,rsp
0x2d706a6ac644 4 6a08 push 0x8
0x2d706a6ac646 6 56 push rsi
0x2d706a6ac647 7 4883ec18 REX.W subq rsp,0x18
0x2d706a6ac64b b 488b5e23 REX.W movq rbx,[rsi+0x23]
0x2d706a6ac64f f 48895dd8 REX.W movq [rbp-0x28],rbx
0x2d706a6ac653 13 483b23 REX.W cmpq rsp,[rbx]
0x2d706a6ac656 16 0f860c010000 jna 0x2d706a6ac768 <+0x128>
0x2d706a6ac65c 1c 83f802 cmpl rax,0x2
0x2d706a6ac65f 1f 0f8cd1000000 jl 0x2d706a6ac736 <+0xf6>
0x2d706a6ac665 25 33d2 xorl rdx,rdx
0x2d706a6ac667 27 e90f000000 jmp 0x2d706a6ac67b <+0x3b>
0x2d706a6ac66c 2c 0f1f4000 nop
0x2d706a6ac670 30 488bc3 REX.W movq rax,rbx
0x2d706a6ac673 33 488b5dd8 REX.W movq rbx,[rbp-0x28]
0x2d706a6ac677 37 488b75f0 REX.W movq rsi,[rbp-0x10]
0x2d706a6ac67b 3b 488945e8 REX.W movq [rbp-0x18],rax
0x2d706a6ac67f 3f 488955e0 REX.W movq [rbp-0x20],rdx
0x2d706a6ac683 43 483b23 REX.W cmpq rsp,[rbx]
0x2d706a6ac686 46 0f86f6000000 jna 0x2d706a6ac782 <+0x142>
0x2d706a6ac68c 4c 8d48ff leal rcx,[rax-0x1]
0x2d706a6ac68f 4f 49ba0000000001000000 REX.W movq r10,0x100000000
0x2d706a6ac699 59 4c3bd1 REX.W cmpq r10,rcx
0x2d706a6ac69c 5c 7720 ja 0x2d706a6ac6be <+0x7e>
0x2d706a6ac69e 5e bf01000000 movl rdi,0x1
0x2d706a6ac6a3 63 4989e2 REX.W movq r10,rsp
0x2d706a6ac6a6 66 4883ec08 REX.W subq rsp,0x8
0x2d706a6ac6aa 6a 4883e4f0 REX.W andq rsp,0xf0
0x2d706a6ac6ae 6e 4c891424 REX.W movq [rsp],r10
0x2d706a6ac6b2 72 48b820cc7e0b01000000 REX.W movq rax,0x10b7ecc20 ;; external reference (abort_with_reason)
0x2d706a6ac6bc 7c ffd0 call rax
0x2d706a6ac6be 7e 488bc1 REX.W movq rax,rcx
0x2d706a6ac6c1 81 e83af9ffff call 0x2d706a6ac000 ;; internal wasm call
0x2d706a6ac6c6 86 488b55e0 REX.W movq rdx,[rbp-0x20]
0x2d706a6ac6ca 8a 03d0 addl rdx,rax
0x2d706a6ac6cc 8c 4c8b15beffffff REX.W movq r10,[rip+0xffffffbe]
0x2d706a6ac6d3 93 4c3bd2 REX.W cmpq r10,rdx
0x2d706a6ac6d6 96 771d ja 0x2d706a6ac6f5 <+0xb5>
0x2d706a6ac6d8 98 bf01000000 movl rdi,0x1
0x2d706a6ac6dd 9d 4989e2 REX.W movq r10,rsp
0x2d706a6ac6e0 a0 4883ec08 REX.W subq rsp,0x8
0x2d706a6ac6e4 a4 4883e4f0 REX.W andq rsp,0xf0
0x2d706a6ac6e8 a8 4c891424 REX.W movq [rsp],r10
0x2d706a6ac6ec ac 488b05c1ffffff REX.W movq rax,[rip+0xffffffc1]
0x2d706a6ac6f3 b3 ffd0 call rax
0x2d706a6ac6f5 b5 488b45e8 REX.W movq rax,[rbp-0x18]
0x2d706a6ac6f9 b9 8d58fe leal rbx,[rax-0x2]
0x2d706a6ac6fc bc 4c8b158effffff REX.W movq r10,[rip+0xffffff8e]
0x2d706a6ac703 c3 4c3bd3 REX.W cmpq r10,rbx
0x2d706a6ac706 c6 771d ja 0x2d706a6ac725 <+0xe5>
0x2d706a6ac708 c8 bf01000000 movl rdi,0x1
0x2d706a6ac70d cd 4989e2 REX.W movq r10,rsp
0x2d706a6ac710 d0 4883ec08 REX.W subq rsp,0x8
0x2d706a6ac714 d4 4883e4f0 REX.W andq rsp,0xf0
0x2d706a6ac718 d8 4c891424 REX.W movq [rsp],r10
0x2d706a6ac71c dc 488b0591ffffff REX.W movq rax,[rip+0xffffff91]
0x2d706a6ac723 e3 ffd0 call rax
0x2d706a6ac725 e5 83f803 cmpl rax,0x3
0x2d706a6ac728 e8 0f8f42ffffff jg 0x2d706a6ac670 <+0x30>
0x2d706a6ac72e ee 488bc3 REX.W movq rax,rbx
0x2d706a6ac731 f1 e902000000 jmp 0x2d706a6ac738 <+0xf8>
0x2d706a6ac736 f6 33d2 xorl rdx,rdx
0x2d706a6ac738 f8 03c2 addl rax,rdx
0x2d706a6ac73a fa 4c8b1550ffffff REX.W movq r10,[rip+0xffffff50]
0x2d706a6ac741 101 4c3bd0 REX.W cmpq r10,rax
0x2d706a6ac744 104 771d ja 0x2d706a6ac763 <+0x123>
0x2d706a6ac746 106 bf01000000 movl rdi,0x1
0x2d706a6ac74b 10b 4989e2 REX.W movq r10,rsp
0x2d706a6ac74e 10e 4883ec08 REX.W subq rsp,0x8
0x2d706a6ac752 112 4883e4f0 REX.W andq rsp,0xf0
0x2d706a6ac756 116 4c891424 REX.W movq [rsp],r10
0x2d706a6ac75a 11a 488b0553ffffff REX.W movq rax,[rip+0xffffff53]
0x2d706a6ac761 121 ffd0 call rax
0x2d706a6ac763 123 488be5 REX.W movq rsp,rbp
0x2d706a6ac766 126 5d pop rbp
0x2d706a6ac767 127 c3 retl
0x2d706a6ac768 128 488945e8 REX.W movq [rbp-0x18],rax
0x2d706a6ac76c 12c e83ffbffff call 0x2d706a6ac2b0 ;; wasm stub: WasmStackGuard
0x2d706a6ac771 131 488b45e8 REX.W movq rax,[rbp-0x18]
0x2d706a6ac775 135 488b75f0 REX.W movq rsi,[rbp-0x10]
0x2d706a6ac779 139 488b5dd8 REX.W movq rbx,[rbp-0x28]
0x2d706a6ac77d 13d e9dafeffff jmp 0x2d706a6ac65c <+0x1c>
0x2d706a6ac782 142 e829fbffff call 0x2d706a6ac2b0 ;; wasm stub: WasmStackGuard
0x2d706a6ac787 147 488b45e8 REX.W movq rax,[rbp-0x18]
0x2d706a6ac78b 14b 488b75f0 REX.W movq rsi,[rbp-0x10]
0x2d706a6ac78f 14f e9f8feffff jmp 0x2d706a6ac68c <+0x4c>
0x2d706a6ac794 154 90 nop
0x2d706a6ac795 155 0f1f00 nop
Source positions:
pc offset position
7e 26
128 0
142 19
Safepoints (size = 20)
0x2d716a6ac63fffffffff (sp -> fp)
RelocInfo (size = 10)
0x2d706a6ac6b4 external reference (0x10b7ecc20)
0x2d706a6ac6c2 internal wasm call
0x2d706a6ac76d wasm stub call
0x2d706a6ac783 wasm stub call
--- End code ---
--- WebAssembly code ---
index: 1
kind: wasm function
compiler: TurboFan
Body (size = 96 = 76 + 20 padding)
Instructions (size = 56)
0x2d706a6ac5e0 0 55 push rbp
0x2d706a6ac5e1 1 4889e5 REX.W movq rbp,rsp
0x2d706a6ac5e4 4 6a08 push 0x8
0x2d706a6ac5e6 6 56 push rsi
0x2d706a6ac5e7 7 4883ec08 REX.W subq rsp,0x8
0x2d706a6ac5eb b 488b5e23 REX.W movq rbx,[rsi+0x23]
0x2d706a6ac5ef f 483b23 REX.W cmpq rsp,[rbx]
0x2d706a6ac5f2 12 0f860a000000 jna 0x2d706a6ac602 <+0x22>
0x2d706a6ac5f8 18 e803faffff call 0x2d706a6ac000 ;; internal wasm call
0x2d706a6ac5fd 1d 488be5 REX.W movq rsp,rbp
0x2d706a6ac600 20 5d pop rbp
0x2d706a6ac601 21 c3 retl
0x2d706a6ac602 22 488945e8 REX.W movq [rbp-0x18],rax
0x2d706a6ac606 26 e8a5fcffff call 0x2d706a6ac2b0 ;; wasm stub: WasmStackGuard
0x2d706a6ac60b 2b 488b75f0 REX.W movq rsi,[rbp-0x10]
0x2d706a6ac60f 2f 488b45e8 REX.W movq rax,[rbp-0x18]
0x2d706a6ac613 33 ebe3 jmp 0x2d706a6ac5f8 <+0x18>
0x2d706a6ac615 35 90 nop
0x2d706a6ac616 36 6690 nop
Source positions:
pc offset position
18 3
22 0
Safepoints (size = 20)
0x2d716a6ac5dfffffffff (sp -> fp)
RelocInfo (size = 3)
0x2d706a6ac5f9 internal wasm call
0x2d706a6ac607 wasm stub call
--- End code ---
あとはcallとかretlとかの特徴的な命令から推測したりしてアセンブリを読んでいきます。
蛇足ですが以下の記事を参考にしたりしてv8に渡すオプションを変えながらアセンブリを取ったりすると面白いかもしれないです。
以上です。
最後まで読んでいただきありがとうございました。
Discussion