نقل قول نوشته شده توسط SyntaxCheck
خوب خوشحالم که بحث و صحبت به اینجا رسید. دوستان بنده یه توضیح کوچولو راجع به دستورات مقایسه ای و انشعابی میدم. دسته اول JZ,JNZ,JO,JNO,JS,JNS,JC,JNC,JP,JNP و در نهایت دسته دوم با یک عضو JMP همگی جزو گروه دستورات خانواده انشعابها (Branches)هستند. JMP انشعاب قطعی(Unconditional Branch) هست و سری اول دستورات که ذکر کردم جزو انشعابات غیر قطعی.البته شرطی خواندن این دستورات انشعابی اصلا کار صحیحی نیست و اینها صرفا پرشهای انشعابی قطعی و یا غیر قطعی هستند. اما دستور شرطی به تنهایی در اسمبلی معنی نداره و به یک بلوک دستور ،ممکنه که شرط گفته بشه، زمانی که یک دستور مقایسه ای و یک دستور انشعابی همراه هم باشند. در زیر چند حالت ممکن رو برای روشن تر شدن منظورم ذکر میکنم:
1) در ابتدای بلوک CMP انجام شود و سپس از دسته انشعابی اول برای جهش استفاده شود این حالت همون IF در زبانهای سطح بالاست.(که طبق راهی که دوست عزیز آقای مشاطان عرض کردند میتونید الگوریتم IF رو مشاهده کنید که یک دستور نیست و مجموعه ای از دو دستور CMP و یک دستور انشعابی هست)
2) در ابتدای بلوک CMP انجام شود و از هیچ دستور انشعابی در ادامه استفاده نشود.این حالت مقایسه محض نام دارد و صرفا جهت تنظیم فلاگها برای مصارف بعدی کاربرد دارد.
3) در بلوک صرفا از دستورات انشعابی(Branches) استفاده شود و در هیچ جای بلوک CMP انجام نشود. این حالت مانند انجام یک پرش از یک قسمت برنامه به یک قسمت دیگر برنامه ممکن است باشد.

اما بنده هم به خوبی میدونم که با یک CMP و یک بلوک کوچیک میشه عدد Max و Min و بدست آورد اما وقتی مسئله مطرح شده توی این تاپیک رو دیدم این الگوریتم رو روش کار کردم که از فرض مسئله تبعیت بکنه.اما آقا کامبیز اگر مثال شما رو (if c then goto carry_set) نگاه کنیم به وضوح از IF در اون استفاده شده و الگوریتم پروسه ای که من نوشتم اصلا همچین کاری رو نمیکنه و یا مثال حضرتعالی با CMP.
اما دوست عزیز آقای Shaniaki ، اساس بله اما خود دستور شرط نه.
اما مسئله اصلی که گویا اصلا بهش توجهی نشده الگوریتم بکار رفته در این پروسه هست. من گفتم الان رفقا اینو که ببینن کلی راجع بهش صحبت میشه. اگر دو عدد رو به مبنای دو ببریم و اون دوتا رو با هم XOR کنیم آخرین بیت روشن جواب بیتی از دو عدد خواهد بود که معین کننده عدد Max و یا Min هست. بزارید با یه مثال بگم:

01010111=87 عدد 0 ام
01100101=101 عدد 1 ام
_____________XOR
00110010=50

بیت سوم از سمت راست همون بیتی از 87و101 هست که اگر XOR همین بیت (1) با همین بیت از عدد اول یعنی (0) انجام بشه عدد 1 بدست میاد که این امر نشون دهنده اونه که مقدار MAX همون عدد 1 ام هست. حالا عملیاتی در ابتدا برای تصحیح بیت علامت انجام شده که برای اعداد اینتیجر همون XOR کردن با $8000 هست و یا برای برگشت مینیمم که XOR کردن جواب با 1 هست(خط //).
ممنون از توضیحات.

منم در توضیح کد خودم اینو بگم که به جای دستور CMP میشه از دستور SUB هم استفاده کرد. تنها فرق ماهیتی که این دو دستور با هم دارند اینه که CMP رجیستر اول رو تغییر نمیده ولی SUB تغییر میده. یعنی کدی رو که در بالا نوشتم رو میشه بدون استفاده از CMP بصورت زیر هم نوشت:

function Min(A, B: Integer): Integer;
asm
mov eax, A { eax <- A }
sub eax, B { eax <- eax - B }
jl @finish { if eax < 0 goto finish }
xor eax, eax { eax <- 0 }
@finish:
add eax, B { eax <- eax + B }
end;

function Max(A, B: Integer): Integer;
asm
mov eax, A { eax <- A }
sub eax, B { eax <- eax - B }
ja @finish { if eax > 0 goto finish }
xor eax, eax { eax <- 0 }
@finish:
add eax, B { eax <- eax + B }
end;