blob: c99cd2b3e3c23e73c611b3cee74adf16617cc264 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
# Copyright 2022-2023 Gabriel Jensen.
# This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at <https://mozilla.org/MPL/2.0>.
.globl zap_syscall
zap_syscall:
# System calls on IA-32 use the following registers:
# eax : System call identifier
# ebx : First parameter
# ecx : Second parameter
# edx : Third parameter
# esi : Fourth parameter
# edi : Fifth parameter
# ebp : Sixth parameter
# eax : Return value
pushl %ebx # Remember to save the registers.
pushl %esi
pushl %edi
pushl %ebp # Remember that the provided paramters are now further up the stack.
movl 0x14(%esp),%eax # Move the first parameter (the identifier) to eax.
movl 0x18(%esp),%ebx # Move the remaining parameters into their designated registers. This will read "out of bounds" memory if the number of passed parameters is less than six, but this shouldn't matter as long as the data isn't being used, which it won't be as long as the expected ammount of parameters have been passed.
movl 0x1C(%esp),%ecx
movl 0x20(%esp),%edx
movl 0x24(%esp),%esi
movl 0x28(%esp),%edi
movl 0x2C(%esp),%ebp
int $0x80 # Flying city
popl %ebp # Restore the registers.
popl %edi
popl %esi
popl %ebx
# No need to move the return value.
ret
|