asm_book/section_1/funcs/README3.md
2023-01-14 14:39:41 -06:00

57 lines
1.8 KiB
Markdown

# Section 1 / Example of calling some common C runtime functions
This chapter gives an example of calling the most common C I/O functions
from assembly language.
There are, by the way, two broad types of functions within the C
runtime. Some are implemented largely in the C runtime itself. Others
that exist in the C runtime act as wrappers for functions implemented
within the OS itself. These are called "system calls".
For the purposes of calling functions in the C runtime, there is no
practical difference between these two types. Note however, there are
ways of calling system calls directly using the `svc` instruction. We
will cover this way of making system calls as well. See
[here](../../more/system_calls/README.md).
## Low level file operations
This example [program](./file_ops.s) makes use of `open()`, `close()`,
`read()`, `write()` and `lseek()`. These are implemented in the C
runtime as wrappers for system calls.
The program will
* create a file,
* write a small amount of text to it,
* rewind (seek) back to the beginning of the file,
* read back and print the contents of the file and then
* close the file.
A lot of error checking is also implemented (frankly speaking: until we
got bored writing the example).
Doing all of these ballooned the example program to about 200 lines. As
such we won't explain the code line by line but, in compensation, the
code is liberally commented.
Here is just a bit:
```text
/* off_t lseek(int fd, off_t offset, int whence);
*/
seek_zero:
stp x29, x30, [sp, -16]!
mov w0, fd // file descriptor
mov x1, xzr // beginning of file
mov w2, wzr // SEEK_SET - absolute offset
bl lseek
ldp x29, x30, [sp], 16
ret
```
Calling this function rewinds the read / write "head" to position 0.