Взялся я переписать свою операционку на Си вместо асма. Дошёл до системных вызывов и тут не знаю как сделать.
Как вызывать системный вызов из пользовательского приложения? Я хочу написать макрос. Дело в том, что если 64 бита, то использовать можно лишь fastcall. И никаких ccall и stdcall. Соответственно и syscall надо передавать по соглашению fastcall. Но не хотелось бы ручками запихивать параметры в регистры. А можно как-нибудь сделать, что параметры в стек/регистры запихнулись как при вызове обычной функции, но вместо call abc было syscall?
Дело в том, что в качестве обработчика syscall у меня стоит:
Код:
syscall_entry:
cmp rax, syscall_max
jae .error
mov rax, [qword syscall_table + rax * 8]
call rax
sysretq
.error:
mov rax, -1
sysretq
Где syscall_table это символ из модуля на Си. Макрос системного вызова должен делать следующее:
1. Запихнуть все параметры в регистры/стек
2. Поместить в rax номер системного вызова
3. Выполнить syscall