۶
کنترل جریان
ساختن شرط و حلقه با استفاده از دستورات پرش (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 ; اگه صفر نشده بود، برگرد به اول حلقه
; ... ادامه برنامه ...