Skip to content
This repository has been archived by the owner on Jun 24, 2022. It is now read-only.

Commit

Permalink
Merge pull request #430 from systemcrash/patch-1
Browse files Browse the repository at this point in the history
Update README.md
  • Loading branch information
yurydelendik authored Nov 26, 2019
2 parents 326317e + b826c09 commit 49afdef
Showing 1 changed file with 4 additions and 4 deletions.
8 changes: 4 additions & 4 deletions templates/hello_world_c/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ This project prints `"Hello World"` using the well known C `printf` function. Th

2. Open the `out/main.wasm` file and notice that there's quite a bit of code. This is somewhat surprising given that our program is so small. The vast majority of this code implements the `printf` function.

3. Notice the imports section, these are SysCalls. To get this WebAssembly module running you'll have to implement these functions first. However, note that these import names don't actually tell you what SysCalls are used, they are merely function stubs (one for each number of parameters).
3. Notice the imports section, these are SysCalls. To get this WebAssembly module running you'll have to implement these functions first. However, note that these import names don't actually tell you what SysCalls are used; they are merely function stubs (one for each number of the parameters).

```
(import "env" "__syscall0" (func $env.__syscall0 (type $t2)))
Expand All @@ -28,14 +28,14 @@ This project prints `"Hello World"` using the well known C `printf` function. Th

5. Take a look at `src/main.js`, this file emulates these basic SysCalls in JavaScript.

6. `brk()` can be stubbed to return `0`, which is the success error code. `brk()` is used to allocate more memory to a process. WebAssembly does handles memory differently, so there's no need to do special here.
6. `brk()` can be stubbed to return `0`, which is the success error code. `brk()` is used to allocate more memory to a process. WebAssembly handles memory differently, so there's no need to be special here.

7. `mmap2()` is used to request more memory within the process. In our example, it's implemented as a call to the WebAssembly `memory.grow()` function.

8. `writev()` is used to write data to files. Its signature is `writev(int fd, const struct iovec *iov, int iovcnt)`. We can ignore the `fd` file descriptor parameter, and focus on the `iov` structure. The problem here is that on the JavaScript side we have a hard time pulling the `struct iovec` abart. We could figure it out, but a neat hack is to call back into the WebAssembly module and have some C code unpack it for us.
8. `writev()` is used to write data to files. Its signature is `writev(int fd, const struct iovec *iov, int iovcnt)`. We can ignore the `fd` file descriptor parameter, and focus on the `iov` structure. The problem here is that on the JavaScript side we have a hard time pulling the `struct iovec` apart. We could figure it out, but a neat hack is to call back into the WebAssembly module and have some C code unpack it for us.

9. Click Run

```
Hello World
```
```

0 comments on commit 49afdef

Please sign in to comment.