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