سینا بختیاری _ استاد راهنما: داوود یعقوبی تبار _ دانشگاه صدرا _ مقاله ی مختصر در مورد پروژه ساده ماشین حساب به زبان اسمبلی در مورد پروژه که یک ماشین حساب ساده هستش ی توضیح مختصر میدیم و بعد میریم سراغ توضیح بعضی از دستورات اصلی داخل برنامه ماشین حساب ما فقط عمل اصلی یعنی (+ و - و و/ رو برای ما انجام میده بعد از اجرا شدن برنامه، دو عدد به همراه یکی از عملگرهای مشخص شده از کاربر گرفته می شود. بعد از فشار دادن کلید Enter برنامه نتیجه عملیات را محاسبه کرده و در خروجی چاپ می کند. این برنامه با استفاده از برنامه emu نوشته شده است در این برنامه ما حداکثر تعداد ارقامی که میتونیم وارد کنیم عدد هستش و اگر عدد ام رو وارد کنیم خود برنامه میاد اون رو برای ما حذف میکنه و اینکه میتونیم اعداد منفی رو به برنامه بدیم و در خروجی عدد منفی هم هم داشته باشیم (برای ضرب اعداد علامتدار از imul و تقسیم از idiv استفاده شده) و یک مورد دیگه اینکه اگر تقسیم ما باقیمانده داشته باشد باقیمانده رو به ما نشون نمیدهد و فقط قسمت صحیح رو نشون میده و برای باقیمانده and somthing رو جلوی اون عدد صحیح قرار میده. خب از انجایی که زبان اسمبلی یک زبان شیء گرا نیستش ما مجبوریم تمام حالات رو در نظر بگیریم و کر هر قسمت رو به صورت جدا وارد بکنیم تا برنامه به درستی اجرا شود. میرسیم به قسمت توضیح برخی از کد های برنامه exit macro ماکروی خروج از برنامه mov ax , ch کد خروج int h endm ; - - - - - - - - - - - - - - - - - - - - - - pushreg macro ماکروی ذخیره اطلاعات ثبات ها در پشته push ax push bx push cx push dx push si push di endm ; - - - - - - - - - - - - - - - - - - - - - - popreg macro ماکروی بازیابی اطلاعات ثبات ها در پشته pop di pop si pop dx pop cx pop bx pop ax endm ; - - - - - - - - - - - - - - - - - - - - - - gets macro str ماکروی گرفتن اطلاعات از کاربر pushreg lea dx , str ادرس رشته در اینجا توی دی ایکس ذخیره میشه mov ah , ah تابع گرفتن اطلاعات int h popreg endm ; - - - - - - - - - - - - - - - - - - - - - - prints macro str چاپ اطلاعات pushreg lea dx , str mov ah , h int h popreg endm ; - - - - - - - - - - - - - - - - - - - - - - getc macro گرفتن یک کاراکتر از کاربر pushreg mov ah , h int h popreg endm ; - - - - - - - - - - - - - - - - - - - - - - itoa macro n , str , len تبدیل عدد به رشته local while pushreg lea di , str mov dl , len mov dh , add di , dx mov byte ptr [ di ], ' $ ' mov al , n mov ah , mov cl , while : dec di div cl add ah , mov [ di ], ah mov ah , cmp al , jne while popreg endm ; - - - - - - - - - - - - - - - - - - - - - - atoi macro str , n , len تبدیل رشته به عدد local while pushreg lea di , str mov ax , mov bx , mov ch , mov cl , len while : mul bl mov dx , mov dl , byte ptr [ di ] sub dx , add ax , dx inc di loop while mov n , al popreg endm ; - - - - - - - - - - - - - - - - - - - - - - . model small . stack . data strlist label byte تعریف برچسب برای ورودی عدد اول max db len db ? str db dup (' $ ') strlist label byte تعریف برچسب برای ورودی عدد دوم max db len db ? str db dup (' $ ') strlist label byte تعریف برچسب برای ورودی عملگر max db len db ? op db dup (' $ ') str db dup (' ')' $ ' نتیجه در اینجا ذخیره میشه msgn db , " Enter Number : $ " اینها پیفام ها هستند و یعنی یه خط برو پایین msgn db , " Enter Number : $ " msgop db , " Enter op (+, - , : $ " msgR db , " Result : $ " n db رشته اول بعد اینکه به عدد تبدیل شد در این متغیر ذخیره میشه n db رشته دوم بعد اینکه به عدد تبدیل شد در این متغیر ذخیره میشه R db حاصل اینجا ذخیره میشه . code main proc far mov ax , @ data mov ds , ax prints msgn چاپ پیغام دریافت عدد اول gets strlist گرفتن عدد اول prints msgn چاپ پیغام دریافت عدد دوم gets strlist گرفتن عدد دوم prints msgop چاپ پیغام دریافت عملگر gets strlist گرفتن عملگر atoi str , n , len تبدیل رشته عددی اول به عدد و قرار دادن آن در ان atoi str , n , len تبدیل رشته عددی دوم به عدد و قرار دادن آن در ان cmp op , '+' مقایسه عمگر با جمع jne skipplus برابر نباشه به پر و جمع رو رد کن mov al , n عدد اول در ا ال add al , n جمع ا ال با ان و ذخیره در ا ال mov R , al حاصل رو به ار بده jmp endcalc پرش کن به اخر و نتیجه رو اونجا چاپ کن skipplus : cmp op , ' - ' jne skipmin برابر نباشه به پر و تفریق رو رد کن mov al , n عدد اول در ا ال sub al , n تفریق ا ال با ان و ذخیره در ا ال mov R , al حاصل رو به ار بده jmp endcalc پرش کن به اخر و نتیجه رو اونجا چاپ کن skipmin : cmp op , '' jne skipmul برابر نباشه به پر و ضربرو رد کن mov ah , ا اچ ضفر میشه چون ضرب و تقسیم اینو هم استفاده می کنه mov al , n عدد اول در ا ال mul n ا ال با ان ضرب شده و در ا ال قرار میگیره mov R , al حاصل از ا ال میره به ار jmp endcalc پرش کن به اخر و نتیجه رو اونجا چاپ کن skipmul : cmp op , '/' jne skipdiv برابر نباشه به پر و تقسیم رو رد کن mov ah , ا اچ ضفر میشه چون ضرب و تقسیم اینو هم استفاده می کنه mov al , n عدد اول در ا ال div n ا ال با ان تقسیم میشه و جواب در ا ال میره mov R , al از ا ال جواب رو بر میداره میریزه به ار jmp endcalc پرش کن به اخر و نتیجه رو اونجا چاپ کن skipdiv : endcalc : itoa al , str , نتیجه رو که عدد است به رشته تبدیل می کنه بعد میزاره به استر prints msgR پیغام چاپ نتیجه prints str حاصل رو چاپ می کنه getc کلید میگیره exit پایان main endp end main