פורמטים של הוראות הפעלה של Dalvik

בדף הזה מפורטים הפורמטים של ההוראות שבהם נעשה שימוש בפורמט קובץ ההפעלה של 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, #+BBBB0000
op vAA, #+BBBB000000000000
 
21c op vAA, type@BBBB
op vAA, field@BBBB
op vAA, method_handle@BBBB
op vAA, proto@BBBB
op 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@CCCC
op 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@BBBB
op {vCCCC .. vNNNN}, site@BBBB
op {vCCCC .. vNNNN}, type@BBBB

כאשר NNNN = CCCC+AA-1, כלומר A קובע את הספירה 0..255, ו-C קובע את המרשם הראשון

 
3rms op {vCCCC .. vNNNN}, vtaboff@BBBB

כאשר NNNN = CCCC+AA-1, כלומר A קובע את הספירה 0..255, ו-C קובע את המרשם הראשון

הפורמט המוצע להוראות של invoke-virtual ו-invoke-super שמקושרים באופן סטטי בפורמט 3rc
3rmi op {vCCCC .. vNNNN}, inline@BBBB

כאשר NNNN = CCCC+AA-1, כלומר A קובע את הספירה 0..255, ו-C קובע את המרשם הראשון

הפורמט המוצע ל-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

כאשר NNNN = CCCC+AA-1, כלומר A קובע את הספירה 0..255, ו-C קובע את המרשם הראשון

invoke-polymorphic/range
AA|op BBBBlo BBBB BBBB BBBBhi 51l op vAA, #+BBBBBBBBBBBBBBBB const-wide