Понимание работы invokevirtual с реальным файлом ijvm
Я пытаюсь реализовать инструкцию invokevirtual в c, и хотя я прочитал, как теоретически это работает, мне трудно понять, что происходит при чтении реального файла ijvm. В частности, пусть следующий файл ijvm:
1d ea df ad 00 01 00 00 00 00 00 04 00 00 00 10
00 00 00 00 00 00 00 1a 10 00 10 00 10 00 10 02
10 03 b6 00 00 10 02 ff 00 03 00 00 15 01 15 02
60 ac
Я так понимаю после 5 бипуш инструкций (10 00 10 00 10 00 10 02 10 03)
, инструкция invokevirtual называется (b6 00 00)
со смещением 16 байт (0x10
читать из cPool) для метода. Однажды IRETURN
называется (ac)
программа должна продолжить с того места, где она находилась до вызова метода для оставшегося файла (10 02 ff)
, Я также понимаю, что первые 4 байта метода (00 03 00 00)
предоставьте некоторую информацию о количестве параметров (00 03)
и размер локальной переменной области (00 00)
,
Что мне неясно, так это как читать остальную часть метода. Что я понимаю, так это то, что я должен запихнуть в стек OBJREF
а затем параметры метода в стек, которые в этом случае задаются равными 3, поэтому 4, включая OBJREF
в целом. Но какие конкретно эти 3 параметра нужно вставить в этот файл? Являются ли результаты последующего ILOAD
а также IADD
операции?
Может кто-нибудь объяснить, как должен выглядеть стек прямо перед INVOKEVIRTUAL
Инструкция называется а как после каждой новой инструкции из метода? Я был бы признателен, если бы вы сослались на меня и на какую-нибудь ссылку с реальным примером, подобным этому. Большое спасибо за уделенное время.