如何查看我的JavaScript(在Chrome)生成的汇编代码?
How to view the assembly code generated from my JavaScript (in Chrome)?
是否有可能查看浏览器从我的 Javascript 生成的最终机器代码(x86 指令)?例如
--- Raw source ---
function add(a, b){
return a + b;
}
...
--- Code ---
source_position = 0
kind = FUNCTION
Instructions (size = 456)
0x36953100 0 8b4c2404 mov ecx,[esp+0x4]
0x36953104 4 81f991806049 cmp ecx,0x49608091 ;; object: 0x49608091 <undefined>
0x3695310a 10 750a jnz 22 (0x36953116)
0x3695310c 12 8b4e13 mov ecx,[esi+0x13]
0x3695310f 15 8b4917 mov ecx,[ecx+0x17]
0x36953112 18 894c2404 mov [esp+0x4],ecx
0x36953116 22 55 push ebp
谢谢!
您的脚本不会直接转换为机器代码。 JavaScript 在虚拟机 V8 上运行(对于 chrome 和经典的 nodejs 都是如此)你可以使用以下方法获取 VM 字节码:
node --print-bytecode script.js
然后V8执行优化字节码,调用外部C库和OSAPI(系统调用)或WEBAPI。即使 javascript 代码相同(例如优化前后),最终机器代码也可能不同。
您也可以从命令行启动 Chrome
--js-flags="--print-bytecode"
UPD:
正如@PeterCordes 注意到的那样,nodejs 允许使用
查看Turbofan 生成的机器代码
node --print-opt-code script.js
Chrome:
--js-flags="--print-opt-code"
您也可以使用 HTML 可视化工具,例如 https://github.com/v8/v8/tree/master/tools/turbolizer
是否有可能查看浏览器从我的 Javascript 生成的最终机器代码(x86 指令)?例如
--- Raw source ---
function add(a, b){
return a + b;
}
...
--- Code ---
source_position = 0
kind = FUNCTION
Instructions (size = 456)
0x36953100 0 8b4c2404 mov ecx,[esp+0x4]
0x36953104 4 81f991806049 cmp ecx,0x49608091 ;; object: 0x49608091 <undefined>
0x3695310a 10 750a jnz 22 (0x36953116)
0x3695310c 12 8b4e13 mov ecx,[esi+0x13]
0x3695310f 15 8b4917 mov ecx,[ecx+0x17]
0x36953112 18 894c2404 mov [esp+0x4],ecx
0x36953116 22 55 push ebp
谢谢!
您的脚本不会直接转换为机器代码。 JavaScript 在虚拟机 V8 上运行(对于 chrome 和经典的 nodejs 都是如此)你可以使用以下方法获取 VM 字节码:
node --print-bytecode script.js
然后V8执行优化字节码,调用外部C库和OSAPI(系统调用)或WEBAPI。即使 javascript 代码相同(例如优化前后),最终机器代码也可能不同。
您也可以从命令行启动 Chrome
--js-flags="--print-bytecode"
UPD:
正如@PeterCordes 注意到的那样,nodejs 允许使用
查看Turbofan 生成的机器代码node --print-opt-code script.js
Chrome:
--js-flags="--print-opt-code"
您也可以使用 HTML 可视化工具,例如 https://github.com/v8/v8/tree/master/tools/turbolizer