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

דף זה מפרט את פורמטי ההוראות המשמשים את פורמט ההפעלה של 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, #+BBBB0000
op vAA, #+BBBB000000000000
21ג op vAA, type@BBBB
op vAA, field@BBBB
op vAA, method_handle@BBBB
op vAA, proto@BBBB
op 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@CCCC
op 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@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
א|ג| על 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

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

invoke-polymorphic/טווח
AA| על BBBB lo BBBB BBBB BBBB היי 51 ליטר op vAA, #+BBBBBBBBBBBBBBBB קונסט רחב