⚙️

v8でjsとwasmのアセンブリを取る方法

33 min read

どうも、こんにちは、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に入れてください。
日本語で書いたスクラップ

https://zenn.dev/umashiba/scraps/5a237041b6af3d
v8の公式ブログ(おすすめ)
https://v8.dev/docs/d8

jsのアセンブリの取り方

まずはjsのアセンブリの取り方についてです。
これは結構簡単です。

  1. jsファイルを作ります。
touch index.js
  1. コードを書きます。
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);
}
  1. アセンブリをとります。
node --print-code index.js > sample.asm

or

d8 --print-code index.js > sample.asm

--print-codeはアセンブリを取るためのv8のフラグです。

これでjsのアセンブリを取ることができます。

jsのアセンブリ(長いので折り畳んでます)
sample.asm
--- 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については以下のサイトを参考にインストールとプロジェクトの生成をしてください。

https://rustwasm.github.io/docs/wasm-pack/tutorials/hybrid-applications-with-webpack/using-your-library.html

さて、本題のアセンブリの取り方についてです。

  1. src/lib.rs内にコードを書きます。
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)
}
  1. wasm-packでプロジェクトをbuildします。ターゲットはnodejs、releaseオプションで最適化をかけます
wasm-pack build --target=nodejs --release 

これでpkgフォルダ内に以下のような名前のwasmファイルが生成されます
rust_webpack_template_bg.wasm

  1. wasmをjsで読み込みます。
    js/index.jsなどのjsファイルでwasmの呼び出しをします。呼び出しのコードは以下のようになるはずです
js/index.js
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を実行する想定)

  1. 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に渡すオプションを変えながらアセンブリを取ったりすると面白いかもしれないです。

https://gist.github.com/ms-fadaei/44ccfa611bf01c1cc8aca598b1349df0

以上です。
最後まで読んでいただきありがとうございました。

参考にさせていただいたサイト・記事

Discussion

ログインするとコメントできます