۶

کنترل جریان

ساختن شرط و حلقه با استفاده از دستورات پرش (Jumps).

مقایسه و پرش: `CMP` و `JMP`

در اسمبلی ما `if/else` یا `for` به شکل مستقیم نداریم. به جاش، دو تا مقدار رو با هم مقایسه (`CMP`) می‌کنیم و بعد بر اساس نتیجه مقایسه، به یه قسمت دیگه از کد پرش (`JMP`) می‌کنیم.

دستور `CMP` دو مقدار رو از هم کم می‌کنه (بدون اینکه نتیجه رو ذخیره کنه) و یه سری فلگ (Flag) رو در پردازنده ست می‌کنه. بعد دستورات پرش شرطی مثل `JE` (Jump if Equal) یا `JNE` (Jump if Not Equal) این فلگ‌ها رو چک می‌کنن.

mov eax, 10
mov ebx, 10

cmp eax, ebx    ; مقایسه EAX و EBX
je  equal_label ; اگه برابر بودن، بپر به equal_label

; ... کدی که وقتی برابر نیستن اجرا می‌شه ...
jmp end_label   ; بپر به انتهای برنامه

equal_label:
    ; ... کدی که وقتی برابرن اجرا می‌شه ...

end_label:
    ; ... ادامه برنامه

ساختن حلقه

حلقه‌ها هم با همین ترکیب `CMP` و پرش ساخته می‌شن. ما یه شمارنده تعریف می‌کنیم و تا وقتی به عدد مورد نظر نرسیده، به ابتدای حلقه برمی‌گردیم.

mov ecx, 5      ; شمارنده ما (۵ بار تکرار)

loop_start:
    ; ... بدنه حلقه اینجا قرار می‌گیره ...
    ; مثلا چاپ یک کاراکتر

    dec ecx         ; یکی از شمارنده کم کن
    cmp ecx, 0      ; با صفر مقایسه‌ش کن
    jne loop_start  ; اگه صفر نشده بود، برگرد به اول حلقه

; ... ادامه برنامه ...