labels-אסמבלי (מחשבון קרב) - תנאים ו

מדריך לתוויות (Labels) ותנאים בסיסיים ב-Assembly x86

ב-Assembly x86, תוויות (Labels) ותנאים הם מרכיבים חשובים לשליטה על זרימת התוכנית.
תוויות משמשות כנקודות התייחסות בקוד שאליהן ניתן לקפוץ, בעוד תנאים משמשים להחלטה האם לבצע קפיצה או לא בהתאם לתוצאה של פעולות אריתמטיות ולוגיות.

 

תוויות (Labels)

תוויות הן שמות שמציינים מיקום מסוים בקוד התוכנית. הן משמשות בעיקר לקפיצות (Jumps) בין חלקים שונים בקוד, מה שמאפשר שליטה גמישה בזרימת התוכנית.

דוגמה בסיסית לשימוש בתוויות:

				
					_start:
    MOV AX, 5       
    CMP AX, 10       
    JG greater_than  
    JL less_than   

equal_to:
    MOV BX, 1        
    JMP end       

greater_than:
    MOV BX, 2        
    JMP end          - קופץ לסיום התוכנית

less_than:
    MOV BX, 3      

end:
    MOV AX, 0x4C00   - סיום התוכנית עם קוד יציאה 0
    INT 0x21         - קריאה למערכת לסיום התוכנית

				
			


הסבר על הדוגמא:

  • _start: תווית זו מציינת את נקודת ההתחלה של התוכנית.
  • CMP AX, 10: משווה את הערך ב-AX ל-10. פעולה זו משפיעה על הדגלים (Flags) במעבד.
  • JG greater_than: קופץ לתווית greater_than אם AX גדול מ-10.
  • JL less_than: קופץ לתווית less_than אם AX קטן מ-10.
  • equal_to, greater_than, less_than: תוויות אלו מסמנות נקודות שונות בקוד שאליהן ניתן לקפוץ בהתאם לתנאי.
  • JMP end: מבצע קפיצה לתווית end כדי לסיים את התוכנית.

     

תנאים בסיסיים

תנאים ב-Assembly מבוססים על תוצאות של פעולות קודמות כמו השוואה (CMP) או חיסור (SUB). תוצאה זו נשמרת בדגלים (Flags) של המעבד, ולאחר מכן ניתן לבצע קפיצות מותנות בהתאם לדגלים אלה.

פקודות קפיצה מותנות נפוצות:

  • JE (Jump if Equal): קופץ אם התוצאה של השוואה היא שוויון (ZF = 1).
  • JNE (Jump if Not Equal): קופץ אם התוצאה של השוואה אינה שוויון (ZF = 0).
  • JG (Jump if Greater): קופץ אם הערך הראשון גדול מהשני במונחים חתומים (SF = OF, ZF = 0).
  • JGE (Jump if Greater or Equal): קופץ אם הערך הראשון גדול או שווה לשני במונחים חתומים (SF = OF).
  • JL (Jump if Less): קופץ אם הערך הראשון קטן מהשני במונחים חתומים (SF ≠ OF).
  • JLE (Jump if Less or Equal): קופץ אם הערך הראשון קטן או שווה לשני במונחים חתומים (SF ≠ OF או ZF = 1).

     

דוגמה לשימוש בתנאים ובתוויות:

				
					section .data
    num1 dw 7
    num2 dw 7

section .text
    global _start

_start:
    MOV AX, [num1]   
    MOV BX, [num2]  
    CMP AX, BX       - AX == BX האם
    JE equal         - אם הם שווים קופץ לתווית 
                          equal    
    JG greater       - BX > AX אם התנאי נכון
                                       קופץ לתווית
                                greater
    JL less         - BX < AX אם התנאי נכון
                                       קופץ לתווית
                                less

equal:
    MOV CX, 0      
    JMP end          - קופץ לסיום

greater:
    MOV CX, 1       
    JMP end          - קופץ לסיום

less:
    MOV CX, -1      

end:
    MOV AX, 0x4C00   - סיום התוכנית עם קוד יציאה 0
    INT 0x21         - קריאה למערכת לסיום התוכנית

				
			


הסבר:

  • CMP AX, BX: משווה בין שני ערכים ב-AX וב-BX.
  • JE equal: קופץ לתווית equal אם AX שווה ל-BX.
  • JG greater: קופץ לתווית greater אם AX גדול מ-BX.
  • JL less: קופץ לתווית less אם AX קטן מ-BX.

     

סיכום

שימוש בתוויות ותנאים ב-Assembly מאפשר שליטה מתקדמת בזרימת התוכנית. על ידי השימוש בפקודות קפיצה מותנות, ניתן לכתוב תוכניות המגיבות בצורה דינאמית בהתאם לתוצאות של חישובים והשוואות.
תוויות מאפשרות לסמן נקודות בקוד שאליהן ניתן לחזור או לקפוץ, מה שמאפשר כתיבת קוד מסודר וקריא יותר.

תודה! בזכותכם נוכל להשתפר