לדלג לתוכן

1.3 בקרת זרימה ולולאות פתרון

flags_ex1.asm – תרגול 1: הבנת דגלים

IDEAL
MODEL small
STACK 100h

DATASEG
; אין משתנים נדרשים

CODESEG
start:
    mov ax, @data
    mov ds, ax

    ; דוגמה 1 – ZF
    mov ax, 5
    sub ax, 5       ; AX = 0 → ZF = 1

    ; דוגמה 2 – SF
    mov ax, 10
    sub ax, 20      ; AX = -10 → SF = 1

    ; דוגמה 3 – CF
    mov ax, 0FFFFh
    add ax, 1       ; AX = 0 → CF = 1, ZF = 1

exit:
    mov ax, 4c00h
    int 21h
END start

flags_ex2.asm – תרגול 2: תנאים ו־CMP

IDEAL
MODEL small
STACK 100h

DATASEG
equal   db ?
greater db ?
less    db ?
zero_flagged db ?
sign_status  db ?

CODESEG
start:
    mov ax, @data
    mov ds, ax

    ; ===== השוואת שני מספרים =====
    mov ax, 10
    mov bx, 20
    cmp ax, bx
    je eq_case
    ja gt_case
    jb lt_case

eq_case:
    mov equal, 1
    jmp done_cmp
gt_case:
    mov greater, 2
    jmp done_cmp
lt_case:
    mov less, 3
done_cmp:

    ; ===== השוואה מול אפס =====
    mov al, 0
    cmp al, 0
    jz is_zero
    mov zero_flagged, 0
    jmp after_zero
is_zero:
    mov zero_flagged, 1
after_zero:

    ; ===== בדיקת סימן =====
    mov ax, -1
    cmp ax, 0
    js negative
    mov sign_status, 0
    jmp done_sign
negative:
    mov sign_status, -1
done_sign:

exit:
    mov ax, 4c00h
    int 21h
END start

flags_ex3.asm – תרגול 3: לולאות

IDEAL
MODEL small
STACK 100h

DATASEG
counter    db 0
done_value db ?

CODESEG
start:
    mov ax, @data
    mov ds, ax

    ; ===== לולאה של 10 פעמים =====
    mov cx, 10
loop1:
    mov al, counter
    inc al
    mov counter, al
    loop loop1

    ; ===== לולאה מ־20 ל־0 =====
    mov cx, 21
    mov al, 20
loop2:
    dec al
    loop loop2
    mov done_value, al

    ; ===== לולאה כל עוד AL אי זוגי =====
    mov al, 7
odd_loop:
    test al, 1
    jz end_odd
    dec al
    jmp odd_loop
end_odd:

exit:
    mov ax, 4c00h
    int 21h
END start

flags_ex4.asm – תרגול 4: בדיקות לפי דגלים

IDEAL
MODEL small
STACK 100h

DATASEG
overflow_happened db ?
is_negative       db ?
not_equal_flag    db ?

CODESEG
start:
    mov ax, @data
    mov ds, ax

    ; ===== בדיקת Overflow =====
    mov al, 100
    add al, 200
    jo ovf
    jmp continue_ovf
ovf:
    mov overflow_happened, 1
continue_ovf:

    ; ===== תוצאה שלילית =====
    mov ax, -10
    cmp ax, 0
    js neg_case
    jmp continue_sign
neg_case:
    mov is_negative, 1
continue_sign:

    ; ===== אי שוויון =====
    mov ax, 5
    mov bx, 6
    cmp ax, bx
    jne noteq
    jmp done_noteq
noteq:
    mov not_equal_flag, 99
done_noteq:

exit:
    mov ax, 4c00h
    int 21h
END start

flags_ex5.asm – תרגול 5: תנאים מתקדמים, TEST וקפיצות

IDEAL
MODEL small
STACK 100h

DATASEG
grade         db 87
result_code   db ?
carry_status  db ?
test_result   db ?

CODESEG
start:
    mov ax, @data
    mov ds, ax

    ; ===== סימולציית ציון =====
    mov al, grade
    cmp al, 60
    jb failed
    cmp al, 85
    ja excellent
    jmp passed

failed:
    mov result_code, 0  ; נכשל
    jmp after_grade
passed:
    mov result_code, 1  ; עובר
    jmp after_grade
excellent:
    mov result_code, 2  ; מעולה
after_grade:

    ; ===== בדיקה אם אין Carry =====
    mov al, 0FFh
    add al, 1
    jnc no_carry
    mov carry_status, 1
    jmp done_carry
no_carry:
    mov carry_status, 0
done_carry:

    ; ===== בדיקה עם TEST =====
    mov al, 5
    test al, al
    jnz non_zero
    mov test_result, 0
    jmp end_test
non_zero:
    mov test_result, 1
end_test:

exit:
    mov ax, 4c00h
    int 21h
END start