2016-11-15 2 views
-3

Я написал несколько интерпретаторов высокого уровня и простой компилятор и интерпретатор байтового кода, и я хочу начать создавать мощный промежуточный язык для моей небольшой операционной системы.Как вызовы Windows API выполняются на уровне сборки?

У этого есть свой собственный API, как и окна, и единственное, что мешает мне начать этот проект, - это знать, как эти конкретные вызовы API (например, win32-формы api) выполняются на уровне сборки.

Есть ли способ увидеть результат сборки не оптимизированного кода c, например, и посмотреть, как именно выполняются вызовы? Или какие-либо источники в WWW?

Заранее спасибо

+0

принять отладчик и пойти :) – RbMm

+2

Win32 API - это не что иное, как набор DLL-функций и COM-интерфейсов. На этом фундаменте создаются такие API, как .NET Forms. Вы знаете, как делать регулярные вызовы функций в сборке? Вы понимаете, как работает стек вызовов? Вызов функций DLL и вызовы метода интерфейса аналогичны вызовам обычной функции, и они устанавливают стек вызовов одинаково, вам просто нужно использовать указатель времени выполнения для получения адреса памяти функции/метода для 'call', будь то из таблицы поиска DLL вашего приложения, загружаемой загрузчиком ОС при запуске приложения или с виртуальной таблицы объекта, и т. д. –

+2

Вам нужно разглядеть между системными вызовами и вызовами Windows API. Если вы пишете свою собственную операционную систему, вы будете писать системные вызовы, а не вызовы Windows API, поэтому это системные вызовы, о которых вам нужно знать. – EJP

ответ

5

Имея C документацию по API, и зная, соглашение о вызовах/ABI, должно быть достаточно, чтобы создать ассемблер, который использует его. Нет необходимости в «магии» (нет встроенных инструкций syscall или что-то в этом роде).


Большая часть API Win32 реализован в пользовательском пространстве библиотек DLL, так API вызовы ничем не отличаются от других вызовов функций библиотеки. (т. е. косвенный CALL с указателем функции, если я правильно помню).

Часто реализация библиотеки функций будет включать в себя syscall взаимодействовать с ядром (или 32-битного кода, может быть, int или sysenter, я не уверен), но этот интерфейс не документированы и не является стабильным по различных версий Windows.

+3

Большинство интерфейсов документированы неофициально, но некоторые из них поступают из таких источников, как Windows DDK и т. Д. До XP системные вызовы обычно выполнялись через 'int', начиная с XP, он был через' sysenter' и с 64-разрядными версиями Windows через ' syscall'. –

+1

Я должен был сказать, что Windows XP поддерживается 'sysenter', но, как я помню, в системах без поддержки' sysenter' он использовал бы 'int' –

Смежные вопросы