דף זה מפרט את פורמטי ההוראות המשמשים את פורמט ההפעלה של Dalvik (DEX) וקוד בתים של Dalvik. זה נועד לשמש בשילוב עם מסמך ההתייחסות של bytecode .
תיאורים חלקים
העמודה הראשונה בטבלת הפורמט מפרטת את הפריסה הסיבית של הפורמט. הוא מורכב מ"מילה" אחת או יותר מופרדות ברווח שכל אחת מהן מתארת יחידת קוד של 16 סיביות. כל תו במילה מייצג ארבע ביטים, הנקראים מביטים גבוהים לנמוכים, עם פסים אנכיים (" |
") משולבים כדי לסייע בקריאה. אותיות רישיות ברצף מ- " A
" משמשות לציון שדות בתוך הפורמט (שאחר כך יוגדרו עוד יותר על ידי עמודת התחביר). המונח " op
" משמש לציון המיקום של קוד אופטימיזציה של שמונה סיביות בתוך הפורמט. אפס חתוך (" Ø
") משמש כדי לציין שכל הביטים חייבים להיות אפס במיקום המצוין.
לרוב, האותיות ממשיכה מיחידות קוד קודמות ליחידות קוד מאוחרות יותר, ומסדר נמוך לסדר גבוה בתוך יחידת קוד. עם זאת, ישנם מספר חריגים לכלל כללי זה, אשר נעשים על מנת לגרום לשמות של חלקים בעלי משמעות דומה להיות זהה על פני פורמטים שונים של הוראות. מקרים אלה מצוינים במפורש בתיאורי הפורמט.
לדוגמה, הפורמט " B|A| op CCCC
" מציין שהפורמט מורכב משתי יחידות קוד של 16 סיביות. המילה הראשונה מורכבת מהאופקוד בשמונה הסיביות הנמוכות וזוג ערכי ארבע סיביות בשמונה הסיביות הגבוהות; והמילה השנייה מורכבת מערך בודד של 16 סיביות.
פורמט מזהים
העמודה השנייה בטבלת הפורמט מציינת את המזהה הקצר של הפורמט, המשמש במסמכים אחרים ובקוד לזיהוי הפורמט.
רוב מזהי הפורמט מורכבים משלושה תווים, שתי ספרות ואחריהן אות. הספרה הראשונה מציינת את מספר יחידות הקוד של 16 סיביות בפורמט. הספרה השנייה מציינת את המספר המרבי של רגיסטרים שהפורמט מכיל (מקסימום, מכיוון שחלק מהפורמטים יכולים להכיל מספר משתנה של רגיסטרים), כאשר הכינוי המיוחד " r
" מציין שטווח אוגרים מקודד. האות האחרונה מציינת באופן חצי מנמוני את סוג הנתונים הנוספים המקודדים על ידי הפורמט. לדוגמה, הפורמט " 21t
" הוא באורך שניים, מכיל הפניה אחת לרשום, ובנוסף מכיל יעד ענף.
לפורמטים של קישור סטטי מוצע יש סיומת נוספת " s
", מה שהופך אותם לארבעה תווים בסך הכל. באופן דומה, לפורמטים המוצעים של קישור "מוטבע" יש סיומת " i
" נוספת. (בהקשר זה, קישור מוטבע הוא כמו קישור סטטי, למעט קשרים ישירים יותר ליישום של מכונה.) לבסוף, כמה פורמטים מוצעים מוזרים (למשל, " 20bc
") כוללים שתי פיסות נתונים אשר שתיהן מיוצגות במזהה הפורמט שלה. .
הרשימה המלאה של אותיות קוד סוג היא כדלקמן. שימו לב שלטפסים מסוימים יש גדלים שונים, בהתאם לפורמט:
מנמוני | מידות סיביות | מַשְׁמָעוּת |
---|---|---|
ב | 8 | חתום מיידי על ידי |
ג | 16, 32 | מדד מאגר קבוע |
ו | 16 | קבועי פנים (בשימוש רק בפורמטים מקושרים סטטית) |
ח | 16 | סימן h מיד ב- (סיביות מסדר גבוה בערך של 32 או 64 סיביות; סיביות מסדר נמוך הן כולם 0 ) |
אני | 32 | i nt חתום מיידי, או 32-bit float |
ל | 64 | חתום מיידי ב- Long, או כפול של 64 סיביות |
M | 16 | קבועי מתודה (בשימוש רק בפורמטים מקושרים סטטית) |
נ | 4 | חתום מיידי n ibble |
ס | 16 | חתום מיידי s hort |
ט | 8, 16, 32 | branch t arget |
איקס | 0 | ללא נתונים נוספים |
תחביר
העמודה השלישית של טבלת הפורמט מציינת את התחביר המכוון לאדם עבור הוראות המשתמשות בפורמט המצוין. כל הוראה מתחילה עם ה-opcode הנקרא, ואחריה, באופן אופציונלי, ארגומנט אחד או יותר, בעצמם מופרדים בפסיקים.
בכל מקום שבו ארגומנט מתייחס לשדה מהעמודה הראשונה, האות של שדה זה מצוינת בתחביר, וחוזרת על עצמה פעם אחת עבור כל ארבע סיביות של השדה. לדוגמה, שדה שמונה סיביות שכותרתו " BB
" בעמודה הראשונה יסומן גם " BB
" בעמודת התחביר.
טיעונים ששמותיהם של רישום הם בצורת " v X
". הקידומת " v
" נבחרה במקום " r
" הנפוץ יותר בדיוק כדי למנוע התנגשות עם ארכיטקטורות (לא וירטואליות) שעליהן עשוי להיות מיושם פורמט Dalvik Executable אשר עצמן משתמשות בקידומת " r
" עבור האוגרים שלהם. (כלומר, החלטה זו מאפשרת לדבר על רגיסטרים וירטואליים וממשיים גם יחד ללא צורך בעקיפה).
לארגומנטים המציינים ערך מילולי יש את הצורה " #+ X
". חלק מהפורמטים מציינים מילטרים שיש להם רק ביטים שאינם אפס בסיביות בסדר גבוה שלהם; עבור אלה, האפסים מיוצגים באופן מפורש בתחביר, למרות שהם אינם מופיעים בייצוג סיבי.
ארגומנטים המציינים הסטת כתובת פקודה יחסית יש את הצורה " + X
".
טיעונים המציינים אינדקס מאגר קבוע מילולי יש את הצורה " kind @ X
", כאשר " kind
" מציין לאיזה מאגר קבוע מתייחסים. כל opcode שמשתמש בפורמט כזה מאפשר במפורש רק סוג אחד של קבוע; עיין בהפניה ל-opcode כדי להבין את ההתכתבות. סוגי המאגר הקבועים הם " string
" (אינדקס מאגר מחרוזות), " type
" (סוג מאגר אינדקס), " field
" (אינדקס מאגר שדות), " meth
" (אינדקס מאגר שיטה) ו-" site
" (התקשר לאינדקס אתרים ).
בדומה לייצוג של מדדי מאגר קבועים, יש גם צורות מוצעות (אופציונליות) המציינות קיזוזים או מדדים מקושרים מראש. ישנם שני סוגים של ערכים מקושרים מראש מוצעים: קיזוז vtable (מסומן כ" vtaboff
") וקיזוז שדה (מסומן כ" fieldoff
").
במקרים שבהם ערך פורמט אינו חלק מהתחביר במפורש אלא בוחר וריאנט, כל וריאציה מופיעה עם הקידומת " [ X = N ]
" (למשל, " [A=2]
") כדי לציין את ההתכתבות .
פורמטים
פוּרמָט | תְעוּדַת זֶהוּת | תחביר | אופקודים בולטים מכוסים |
---|---|---|---|
לא | 00x | N/A | פסאודו פורמט המשמש לקודים שאינם בשימוש; מוצע לשימוש כפורמט הנומינלי עבור קוד נקודת שבירה |
ØØ| אופ | פי 10 | op | |
B|A| אופ | 12x | op vA, vB | |
11n | op vA, #+B | ||
AA| אופ | 11x | op vAA | |
10ט | op +AA | לך ל | |
ØØ| על AAAA | 20ט | op +AAAA | goto/16 |
AA| על BBBB | 20 לפני הספירה | op AA, kind@BBBB | פורמט מוצע לשגיאות אימות שנקבעו סטטית; A הוא סוג השגיאה ו-B הוא אינדקס לטבלה מתאימה לסוג (למשל הפניות לשיטה לשגיאה ללא שיטה כזו) |
AA| על BBBB | 22x | op vAA, vBBBB | |
21ט | op vAA, +BBBB | ||
21 שניות | op vAA, #+BBBB | ||
21 שעות | op vAA, #+BBBB0000op vAA, #+BBBB000000000000 | ||
21ג | op vAA, type@BBBBop vAA, field@BBBBop vAA, method_handle@BBBBop vAA, proto@BBBBop vAA, string@BBBB | צ'ק-קאסט const-class const-method-handle const-method-type const-string | |
AA| על CC|BB | 23x | op vAA, vBB, vCC | |
22ב | op vAA, vBB, #+CC | ||
B|A| על CCCC | 22ט | op vA, vB, +CCCC | |
22 שניות | op vA, vB, #+CCCC | ||
22ג | op vA, vB, type@CCCCop vA, vB, field@CCCC | מופע של | |
22 ש' | op vA, vB, fieldoff@CCCC | פורמט מוצע להוראות גישה לשדה מקושר סטטי בפורמט 22c | |
ØØ| op AAAA lo AAAA היי | 30ט | op +AAAAAAAA | goto/32 |
ØØ| על AAAA BBBB | 32x | op vAAAA, vBBBB | |
AA| על BBBB lo BBBB היי | 31i | op vAA, #+BBBBBBBB | |
31ט | op vAA, +BBBBBBBB | ||
31ג | op vAA, string@BBBBBBBB | const-string/jumbo | |
א|ג| על 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| על 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 | |
א|ג| על 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| על BBBB CCCC HHHH | 4rcc | op> {vCCCC .. vNNNN}, meth@BBBB, proto@HHHH כאשר | invoke-polymorphic/טווח |
AA| על BBBB lo BBBB BBBB BBBB היי | 51 ליטר | op vAA, #+BBBBBBBBBBBBBBBB | קונסט רחב |