mirror of
https://github.com/pkivolowitz/asm_book.git
synced 2026-06-21 04:26:47 +08:00
57 lines
1.8 KiB
Markdown
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.
|