בדף הזה מפורטים הפורמטים של ההוראות שבהם נעשה שימוש בפורמט קובץ ההפעלה של Dalvik (DEX) ובקוד בינארי של Dalvik. הוא מיועד לשימוש בשילוב עם מסמך העזרה בנושא קוד בייט.
תיאורים ביטים
בעמודה הראשונה בטבלת הפורמט מופיעה הפריסה של הפורמט לפי ביט. הוא מורכב מ'מילים' אחת או יותר שמפרידים ביניהן רווחים, וכל אחת מהן מתארת יחידת קוד של 16 ביט. כל תו במילה מייצג ארבעה ביטים, שנקראים מהביטים הגבוהים לביטים הנמוכים, עם קווים אנכיים (|
) שמפוזרים ביניהם כדי לעזור בקריאה. אותיות רישיות ברצף מ-A
משמשות לציון שדות בפורמט (שמתוארים בהמשך בעמודת התחביר). המונח op
משמש לציון המיקום של קוד הפקודה באורך שמונה ביט בפורמט. אפס עם קו חוצה ("Ø
") משמש לציון שכל הביטים חייבים להיות אפס במיקום שצוין.
ברוב המקרים, האותיות מופיעות ביחידות קוד מוקדמות יותר, ולאחר מכן ביחידות קוד מאוחרות יותר, ומתחילות באותיות בעלות דרגה נמוכה וממשיכות באותיות בעלות דרגה גבוהה יותר בתוך יחידת הקוד. עם זאת, יש כמה יוצאים מן הכלל לכלל הזה, שנועדו להבטיח שחלקים עם משמעות דומה יקבלו שמות זהים בפורמטים שונים של הוראות. במקרים כאלה, יצוין זאת במפורש בתיאורי הפורמטים.
לדוגמה, הפורמט B|A|op CCCC
מציין שהפורמט מורכב משתי יחידות קוד של 16 ביט. המילה הראשונה מורכבת מקוד הפקודה בשמונת הביטים הנמוכים ומצמד ערכים של ארבעה ביטים בשמונת הביטים הגבוהים. המילה השנייה מורכבת מערך יחיד של 16 ביט.
מזהי פורמטים
העמודה השנייה בטבלת הפורמטים מציינת את המזהה הקצר של הפורמט, שמשמש לזיהוי הפורמט במסמכים אחרים ובקוד.
רוב מזהי הפורמט מורכבים משלושה תווים, שתי ספרות ואחריה אות. הספרה הראשונה מציינת את מספר יחידות הקוד באורך 16 ביט בפורמט. הספרה השנייה מציינת את המספר המקסימלי של הרשומות שהפורמט מכיל (מקסימלי, כי בפורמטים מסוימים אפשר לאחסן מספר משתנה של רשומות), והסימון המיוחד r
מציין שהקוד מקודד טווח של רשומות. האות האחרונה מציינת באופן חלקי את סוג הנתונים הנוספים שמקודדים בפורמט. לדוגמה, הפורמט 21t
הוא באורך שניים, מכיל הפניה אחת למרשם וגם יעד להסתעפות.
לפורמטים המוצעים לקישור סטטי יש סיומת נוספת של s
, כך שהם מכילים ארבעה תווים בסך הכול. באופן דומה, לפורמטים המוצעים של קישורים 'inline' יש סיומת נוספת של i
. (בהקשר הזה, קישור בקוד דומה לקישור סטטי, מלבד קישורים ישירים יותר להטמעה של מכונה).
לסיום, כמה הצעות לפורמטים חריגים (למשל,
20bc
) כוללים שני קטעי נתונים שמוצגים במזהה הפורמט שלהם.
הרשימה המלאה של האותיות של קודי הטיפוסים היא: חשוב לזכור שלטפסים מסוימים יש גדלים שונים, בהתאם לפורמט:
שיטות לזכירה | גדלים של ביטים | משמעות |
---|---|---|
b | 8 | byte חתום מיידי |
c | 16, 32 | אינדקס של מאגר קבוע |
f | 16 | קבועי face (משמשים רק בפורמטים מקושרים באופן סטטי) |
h | 16 | hat חתום מיידי (ביטים בסדר גבוה של ערך של 32 או 64 ביט, כל הביטים בסדר נמוך הם 0 )
|
i | 32 | int חתום מיידי או מספר ממשי (float) ב-32 ביט |
l | 64 | long חתום מיידי או כפול 64 ביט |
m | 16 | קבועי method (משמשים רק בפורמטים מקושרים באופן סטטי) |
n | 4 | nibble חתום מיידי |
s | 16 | short חתום מיידי |
t | 8, 16, 32 | branch target |
x | 0 | ללא נתונים נוספים |
תחביר
העמודה השלישית בטבלת הפורמטים מציינת את התחביר שמותאם לבני אדם להוראות שמשתמשות בפורמט שצוין. כל הוראה מתחילה בקוד הפקודה שצוין, ואחריה יכולים להופיע ארגומנט אחד או יותר, שמופרדים בפסיק.
בכל מקום שבו ארגומנט מתייחס לשדה מהעמודה הראשונה, האות של השדה הזה מצוינה בתחביר, וחוזרת על עצמה פעם לכל ארבעת הביטים של השדה. לדוגמה, שדה של שמונה ביט שמסומן בתווית BB
בעמודה הראשונה מסומן בתווית BB
גם בעמודת התחביר.
ארגומנטים שמציינים שם של מרשם הם בפורמט vX
. הקידומת v
נבחרה במקום הקידומת הנפוצה יותר r
, כדי למנוע התנגשויות עם ארכיטקטורות (לא וירטואליות) שבהן יכול להיות שהפורמט Dalvik Executable יוטמע, והן משתמשות בקידומת r
למרשמים שלהן. (כלומר, ההחלטה הזו מאפשרת לדבר גם על מרשם וירטואלי וגם על מרשם אמיתי יחד, בלי צורך בניסוח עקיף).
ארגומנטים שמציינים ערך לישן (literal) הם בפורמט #+X
. בפורמטים מסוימים מצוינים לישנים שיש להם רק ספרות שאינן אפס בספרות הבכירות שלהם. במקרים כאלה, האפסים מיוצגים באופן מפורש בתחביר, גם אם הם לא מופיעים בייצוג הבינארי.
ארגומנטים שמציינים את ההיסט של כתובת ההוראה היחסית הם מסוג +X
.
ארגומנטים שמציינים אינדקס של מאגר קבועים מילולי הם בפורמט kind@X
, כאשר kind
מציין לאיזה מאגר קבועים מתבצעת ההפניה. כל קוד הפעלה שמשתמש בפורמט כזה מאפשר באופן מפורש רק סוג אחד של קבוע. כדי להבין את ההתאמה, אפשר לעיין במסמך העזר בנושא קודי הפעלה. הסוגים של מאגר הקבועים הם 'string
' (מספר מאגר המחרוזות), 'type
' (מספר מאגר הטיפוסים), 'field
' (מספר מאגר השדות), 'meth
' (מספר מאגר השיטות) ו-'site
' (מספר אתר הקריאה).
בדומה לייצוג של אינדקסים של מאגר קבועים, יש גם הצעות (אופציונליות) לפורמטים שמציינים ערכים מוגדרים מראש של אופסים או אינדקסים. יש שני סוגים של הצעות לערך מקושר מראש: היסטים של טבלת V (שסומנו בתור vtaboff
) והיסטים של שדות (שסומנו בתור fieldoff
).
במקרים שבהם ערך הפורמט לא נכלל במפורש בתחביר, אלא בוחרים בווריאנט, כל וריאנט מופיע עם הקידומת [X=N]
(למשל, [A=2]
) כדי לציין את ההתאמה.
פורמטים
פורמט | מזהה | תחביר | אופקודים בולטים שכלולים |
---|---|---|---|
לא רלוונטי | 00x | N/A |
פורמט פסאודו שמשמש לפקודות מופעל שלא בשימוש. מומלץ להשתמש בו כפורמט נומינלי לפקודת מופעל של נקודת עצירה |
ØØ|op | פי 10 | op |
|
B|A|op | 12x | op vA, vB |
|
11n | op vA, #+B |
||
AA|op | 11x | op vAA |
|
10t | op +AA |
עבור אל | |
ØØ|op AAAA | 20t | op +AAAA |
goto/16 |
AA|op BBBB | 20bc | op AA, kind@BBBB |
הפורמט המומלץ לשגיאות אימות שמוגדרות באופן סטטי: A הוא סוג השגיאה ו-B הוא אינדקס לטבלה שמתאימה לסוג (למשל, הפניות לשיטות עבור שגיאה מסוג no-such-method) |
AA|op BBBB | 22x | op vAA, vBBBB |
|
21t | op vAA, +BBBB |
||
21 שנ' | op vAA, #+BBBB |
||
21 שעות | op vAA, #+BBBB0000op vAA, #+BBBB000000000000
|
||
21c | op vAA, type@BBBBop vAA, field@BBBBop vAA, method_handle@BBBBop vAA, proto@BBBBop vAA, string@BBBB
|
check-cast const-class const-method-handle const-method-type const-string |
|
AA|op CC|BB | 23x | op vAA, vBB, vCC |
|
22b | op vAA, vBB, #+CC |
||
B|A|op CCCC | 22t | op vA, vB, +CCCC |
|
22 שניות | op vA, vB, #+CCCC |
||
22c | op vA, vB, type@CCCCop vA, vB, field@CCCC
|
instance-of | |
22cs | op vA, vB, fieldoff@CCCC |
הפורמט המוצע להוראות גישה לשדות שמקושרים באופן סטטי בפורמט 22c | |
ØØ|op AAAAlo AAAAhi | 30t | op +AAAAAAAA |
goto/32 |
ØØ|op AAAA BBBB | 32x | op vAAAA, vBBBB |
|
AA|op BBBBlo BBBBhi | 31i | op vAA, #+BBBBBBBB |
|
31t | op vAA, +BBBBBBBB |
||
31c | op vAA, string@BBBBBBBB |
const-string/jumbo | |
A|G|op BBBB F|E|D|C | 35c | [A=5 ] op {vC, vD, vE, vF, vG},
meth@BBBB[ A=5 ] op {vC, vD, vE, vF, vG},
site@BBBB[ A=5 ] op {vC, vD, vE, vF, vG},
type@BBBB[ A=4 ] op {vC, vD, vE, vF},
kind @BBBB[ A=3 ] op {vC, vD, vE},
kind @BBBB[ A=2 ] op {vC, vD},
kind @BBBB[ A=1 ] op {vC},
kind @BBBB[ A=0 ] op {},
kind @BBBBהבחירה הלא רגילה של האותיות כאן משקפת את הרצון להשתמש באותה תווית לספירה ולמספר העזרה כמו בפורמט 3rc. |
|
35 אלפיות השנייה | [A=5 ] op {vC, vD, vE, vF, vG},
vtaboff@BBBB[ A=4 ] op {vC, vD, vE, vF},
vtaboff@BBBB[ A=3 ] op {vC, vD, vE},
vtaboff@BBBB[ A=2 ] op {vC, vD},
vtaboff@BBBB[ A=1 ] op {vC},
vtaboff@BBBBהבחירה הלא רגילה של האותיות כאן משקפת את הרצון לתת לספירה ולמספר העזר את אותה תווית כמו בפורמט 3rms. |
הפורמט המוצע להוראות invoke-virtual ו-invoke-super שמקושרות באופן סטטי בפורמט 35c
|
|
35 מייל | [A=5 ] op {vC, vD, vE, vF, vG},
inline@BBBB[ A=4 ] op {vC, vD, vE, vF},
inline@BBBB[ A=3 ] op {vC, vD, vE},
inline@BBBB[ A=2 ] op {vC, vD},
inline@BBBB[ A=1 ] op {vC},
inline@BBBBהבחירה הלא רגילה של האותיות כאן משקפת את הרצון לתת לספירה ולמספר העזרה את אותה תווית כמו בפורמט 3rmi. |
הפורמט המוצע לקישורים invoke-static בתוך שורה ולהוראות invoke-virtual בפורמט 35c
|
|
AA|op BBBB CCCC | 3rc | op {vCCCC .. vNNNN}, meth@BBBBop {vCCCC .. vNNNN}, site@BBBBop {vCCCC .. vNNNN}, type@BBBBכאשר |
|
3rms | op {vCCCC .. vNNNN}, vtaboff@BBBBכאשר |
הפורמט המוצע להוראות של invoke-virtual ו-invoke-super שמקושרים באופן סטטי בפורמט 3rc
|
|
3rmi | op {vCCCC .. vNNNN}, inline@BBBBכאשר |
הפורמט המוצע ל-invoke-static מוטמע עם קישורים ובהוראות ל-invoke-virtual בפורמט 3rc
|
|
A|G|op BBBB F|E|D|C HHHH | 45 סמ"ק |
[A=5 ] op {vC, vD, vE, vF, vG}, meth@BBBB, proto@HHHH[ A=4 ] op {vC, vD, vE, vF}, meth@BBBB, proto@HHHH[ A=3 ] op {vC, vD, vE}, meth@BBBB, proto@HHHH[ A=2 ] op {vC, vD}, meth@BBBB, proto@HHHH[ A=1 ] op {vC}, meth@BBBB, proto@HHHH
|
invoke-polymorphic |
AA|op BBBB CCCC HHHH | 4rcc |
op> {vCCCC .. vNNNN}, meth@BBBB, proto@HHHH
כאשר |
invoke-polymorphic/range |
AA|op BBBBlo BBBB BBBB BBBBhi | 51l | op vAA, #+BBBBBBBBBBBBBBBB |
const-wide |