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


מדריך לשימוש בלולאות עם תוויות ב-Assembly x86

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

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


דוגמה ללולאת LOOP בסיסית

פקודת LOOP שמפחיתה את הערך באוגר CX ב-1 בכל איטרציה, ולאחר מכן מבצעת קפיצה לתווית מוגדרת אם הערך של CX אינו 0. זו היא דרך פשוטה לחזור על קטעי קוד מספר קבוע של פעמים.

				
					section .data
    counter dw 5    - קובע את מספר החזרות ללולאה

section .text
    global _start

_start:
    MOV CX, [counter]  - טוען את הערך של
                                    CX 
                                    לתוך 
                                    counter

loop_start:
    ; כאן תבצע את הפעולה החוזרת

    DEC CX            - מקטין את
                            CX
                           ב 1
    JNZ loop_start     -         אם 
                                 CX
                   אינו שווה ל 0 קופץ ל 
                         loop_start

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

				
			

 

לולאה אינסופית

לולאה אינסופית היא לולאה ללא תנאי עצירה, והיא מתבצעת ללא הגבלה עד שהמשתמש מפסיק את התוכנית או שמתקיימת פעולה כלשהי שתפסיק את התוכנית מבפנים.

				
					section .text
    global _start

_start:

infinite_loop:
    ; כאן תבצע את הפעולה החוזרת

    JMP infinite_loop

				
			

 

לולאה מבוססת תנאי

במקרים בהם נדרש לצאת מהלולאה כאשר תנאי מסוים מתקיים, ניתן להשתמש בתוויות ובפקודות קפיצה מותנות כדי לשלוט על יציאה מהלולאה.

				
					assembly
Copy code
section .data
    num dw 10       - ערך ההתחלה
    limit dw 0      - גבול התוצאה

section .text
    global _start

_start:
    MOV CX, [num]     - טוען את הערך של num ל-CX

loop_start:
    CMP CX, [limit]   - משווה את CX ל-limit
    JLE end_loop      - אם CX קטן או שווה ל-limit, קופץ לסיום הלולאה

    DEC CX            - מקטין את CX ב-1
    JMP loop_start    - קופץ חזרה לתווית loop_start

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

				
			


לולאת LOOP עם תנאי נוסף

ניתן לשלב לולאת LOOP עם תנאי נוסף כדי ליצור לולאה שמתבצעת עד שמתקיים גם תנאי על מספר האיטרציות וגם תנאי על ערכים מסוימים.

				
					section .data
    num dw 10       - ערך ההתחלה
    limit dw 0      - גבול התוצאה

section .text
    global _start

_start:
    MOV CX, [num]   

loop_start:
    CMP CX, [limit]  
    JLE end_loop   

    DEC CX           
    JMP loop_start

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

				
			

 

סיכום

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

 

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