首页 > 系统相关 >WebAssembly01--在JavaScript中读写C/C++内存

WebAssembly01--在JavaScript中读写C/C++内存

时间:2022-10-12 11:15:25浏览次数:75  
标签:value -- double JavaScript Module int C++ mem ptr

编译选项

emcc mem.cc -o mem.js

mem.cc

#include "util.h"
int g_int=42;
double g_double = 3.1415926;
EM_PORT_API(int*)get_int_ptr(){
    return &g_int;
}

EM_PORT_API(double*)get_double_ptr()
{
    return &g_double;
}
EM_PORT_API(void)print_data(){
    printf("C{g_int:%d}\n",g_int);
    printf("C{g_double:%lf}\n",g_double);
}

mem.html

<html>
    <head></head>
    <body>
        <script>
            Module={}
            Module.onRuntimeInitialized = function(){
                var int_ptr = Module._get_int_ptr();
                var int_value = Module.HEAP32[int_ptr>>2];
                console.log("JS{int_value:"+int_value+"}");
                var double_ptr = Module._get_double_ptr();
                var double_value = Module.HEAPF64[double_ptr>>3];
                console.log("JS{double_value:"+double_value+"}");

                Module.HEAP32[int_ptr>>2] = 13;
                Module.HEAPF64[double_ptr>>3]=123456.3789;
                Module._print_data();
            }
        </script>
        <script src="mem.js"></script>
    </body>
</html>

运行命令

emrun --no_browser --port 8000 mem.html

运行效果图

简要说明

操作内存是需要字节对齐 这也是上面js代码中右移2 位和3位的原因具体请参照
https://www.cntofu.com/book/150/zh/ch2-c-js/ch2-03-mem-model.md

Module.HEAPX

Emscripten 已经位Module.buffer创建了常用的类型

标签:value,--,double,JavaScript,Module,int,C++,mem,ptr
From: https://www.cnblogs.com/simp/p/16783789.html

相关文章

  • WebAssembly01--util.h
    内容简要请使用者自行优化#ifndefEM_PORT_API# ifdefined(__EMSCRIPTEN__)# include<emscripten.h># ifdefined(__cplusplus)# defineEM_PORT_API(rettype)......
  • 键盘录入两个圆的半径(整数),比较两个圆的面积
    publicclassTest2{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);System.out.println("请输入第一个圆的半径"......
  • java 实现接口频次限制
    1、添加依赖<dependency><groupId>net.jodah</groupId><artifactId>expiringmap</artifactId><version>0.5.10</versio......
  • Java控制台简易计算器(两数运算)
    Java控制台简易计算器(两数运算)源代码使用while循环,Scanner方法,Switch语句实现交互效果packagecom.ge.method;importjava.util.Scanner;publicclassDemo04{......
  • 路由守卫
    vue中路由守卫一共有三种,一个全局路由守卫,一个是组件内路由守卫,一个是router独享守卫。全局路由守卫:beforeEach前置守卫affterEach后置守卫beforeResolve解析守卫......
  • 【2022-10-05】回趟老家
    20:00即使生活还相当艰难,爱情还隐隐约约,学习还道路方长,社会还明明暗暗,人间还有许多不平,你也要投入,你也要尽力尽情尽兴尽一切可能,努力争取一切可以争取到也应该争取到的,以......
  • java笔记
    代码规范命名规范项目名:见名知意,英文,小写包名:公司反域名;小写类名:见名知意,驼峰原则,不能有特殊符号,支持_,数字不能放开头类名如果有多个单词,每个单词大......
  • midway
    midway:Midway是一个适用于构建Serverless服务,传统应用、微服务,小程序后端的Node.js框架。github:https://github.com/midwayjs/midwaystar:6.1kWeeklyDownloa......
  • QinQ
    QinQ概述QinQ(802.1Qin802.1Q)技术是一项扩展VLAN空间的技术,通过在802.1Q标签报文的基础上再曾加一层802.1Q的Tag来达到扩展VLAN空间的功能如图所示,用户报文在公网上......
  • 【2022-10-04】连岳摘抄
    23:59我觉得个人的态度最好的一方面了解到自己的渺小,一方面尽量地希望这个渺小的生命还是有点意义。                     ......