понимание количества слов в аргументе invoke-kind/range

У меня возникли проблемы с пониманием структуры опкода invoke-kind/range,

Синтаксис

invoke-kind/range {vCCCC .. vNNNN}, meth@BBBB

Аргументы

A: количество слов аргумента (8 бит)

B: индекс ссылки на метод (16 бит)

C: регистр первого аргумента (16 бит)

N = A + C - 1

Как вы можете видеть, B и C упоминаются в синтаксисе байт-кода, но A не упоминается. Где находится аргумент A и что именно он означает?

Спасибо.


person Kikapi    schedule 09.02.2016    source источник


Ответы (1)


A содержит количество регистров, которые передаются методу.

Итак, если у вас есть invoke-static/range {v0 .. v7}, method, то A будет равно 8, а C равно 0. Из формулы внизу видно, что N, последний переданный регистр, вычисляется как N = A + C - 1, поэтому N = 0 + 8 - 1 = 7

person JesusFreke    schedule 09.02.2016
comment
Я до сих пор не могу понять структуру. Формат инструкции 3rc, это означает, что размер инструкции 3*16=48bits, скажем, инструкция invoke-static/range {v0 .. v7}, method, сначала 8bits - это код операции, затем у нас есть 2*16bits, который содержит регистры v0 и v7, тогда у нас есть индекс ссылки на метод, который равен 16bit, тогда общий размер инструкции будет 8+16+16+16=56bits. Что я упускаю? - person Kikapi; 09.02.2016
comment
Вы можете найти код инструкций по декодированию (используемый верификатором) здесь: android.googlesource.com/platform/dalvik/+/kitkat-mr2-release/ . Инструкции хранятся в 16-битных порциях, поэтому остальные 8 битов порции, содержащей A, не используются в 3rc. - person fadden; 10.02.2016
comment
Форматы инструкций определены на странице source.android.com/devices/tech/. dalvik/instruction-formats.html. Формат 3rc — AA|op BBBB CCCC, поэтому у нас есть 8 бит для количества регистров, 8 бит для кода операции, затем 16 бит для первого регистра и 16 бит для ссылки на метод, всего 48 бит. - person JesusFreke; 10.02.2016
comment
Далее у нас есть 2*16 бит, которые содержат регистры v0 и v7 — это неправильно: 16 бит для кодирования v0, а затем 8 бит для кодирования того факта, что регистров 8. Сам v7 не кодируется напрямую, это подразумевается на основе первого регистра и общего количества регистров. - person JesusFreke; 10.02.2016