# برنامه نویسی سطح پایین > برنامه نویسی اسمبلی خانواده x86 >  چهار عمل اصلی در اسمبلی

## Metaldevil

سلام دوستان راستشو بخواین من باید یه پروژه تو زبان اسمبلی برا دانشگاهمون بنویسم که فقط چهار عمل اصلی رو انجام بده. فعلا دو عمل جمع و تفریق رو نوشتم ولی یه خورده ایراد داره ازتون می خام یه کمی باهاش ور برین و کمکم کنین ممنون می شم :خجالت:  soheilmamdouhi2003@gmail.com :متفکر:

----------


## Younes

سلام
مشکل شما در رعایت نکردن قوانین زبان اسمبلی است. در خطوط 88 و 90 دو حافظه را باهم مقایسه کرده اید در حالی که در اسمبلی هردو آپرند باهم نمیتوانند حافظه باشند. یا مثلا خط 108 یک بایت را در یک کلمه میخواهید بریزید ( هر دو آپرند باید هم طول باشند) . این اشکلات نحوی را از بین ببرید تا بتوانید اجرای برنامه را ببینید.
درمورد اشکالات منطقی : اولا که برای خواندن یک رشته از ورودی باید همیشه طول را یکی بیشتر تعیین کنید زیرا وقفه مربوطه همیشه در انتهای رشته یک 0DH اضافه می کند.
نکته دیگری که باید رعایت کنید گرفتن عدد از ورودی است . در اسمبلی ما هر چه از ورودی می گیریم بصورت کاراکتر است و خود باید آنرا به عدد تبدیل کنیم یا از دستورات جمع و تفریق اسکی اسفاده نمایید .

----------


## Younes

شما باید مثلا برای تبدیل '3' به 3 (حرف 3 به عدد 3)  از کد مربوطه 30H کم کنید (یا 48 دسیمال) اما اگر عدد بیش از یک رقم داشته باشد مثلا عدد 123 شماباید بعد از تبدیل یک آنرا جایی نگه دارید و بعد از اینکه 2 را تبدیل کردید 1 را در 10 ضرب کرده با 2 جمع کنید و بعد از تبدیل '3' به   عدد 3باید عدد قبلی (یعنی 12) را در 10ضرب کرده و با 3 جمع کنید تا به عدد 123 (درمقابل رشته        '123' ) برسید. 
درمورد دستورات اسکی می توانید به کتابها رجوع کنید زیرا من در برنامه ها هیچوقت استفاده نکرده ام .

----------


## Younes

با سلام
اولا خواهش میکنم پیغامها را با فونت فارسی بنویس. ثانیا مشکل اعدادشما همان مشکل بافر است شما اعدادرا بصورت کاراکتری در بافر خوانده اید و باید آنها را به عدد تبدیل کرده و در متغیرهای مربوطه قرار دهید. مسئله ای که درمورد علامت '+' عنوان کردید به همین دلیل است که این یک کاراکتر است و شما توانسته ای که آنرا درست تشخیص بدهید اما اعدادرا نمیتوانید .

----------


## dostmohammady

سلام من هم برنامه ی شما را دارم.من جمع وضرب را انجام داده ام ولی توی تفریق وتقسیم 
مشکل دارم بیا اطلاعاتمون رو با هم ترکیب کنیم وبرنامه رو بنویسیم.

----------


## Metaldevil

دوست عزیز من آقا Younes با تشکر از راهنمایی که کردی سعی می کنم این موردی که شما فرمودین رو روی برنامم پیاده کنم.
خانوم دوست محمدی من خوشهال میشم اطلاعاتمون رو با هم به اشتراک بزاریم. :چشمک:

----------


## dostmohammady

عمل ضرب 
mov al,x
mov bl,y
imul bl
mov ah,0
add ax,30h
mov dh,0
mov dx,ax
mov ah,02h
int 21
در ضمن باید مثل جمع عدد ورودی را 30hکم کنید.همان x,y
امیدوارم بدرداتان بخورد.حالا شما عمل تفریق وتقسیم رو بگین.

----------


## Younes

باسلام
خانم دوست محمدی برنامه شما درصورتی جواب درست رانمایش می دهد که حاصلضرب شما یک رقمی باشد. یعنی نهایتا 3*3 .

----------


## Smart User

سلام.
این برنامه چهار عما اصلی رو روی دو عدد دو رقمی انجام می ده .

اعداد رو به صورت دو رقمی وارد کنید یعنی 01 یا 18 و نه عدد 1 یا 4 .

ابتدا عدد اول را وارد کرده و enter  را بزنید
بعد علامت + - * /  و enter  را بزنید
بعد عدد دوم  را وارد کنید و enter بزنید

درضمن این برنامه فلگ های z , p , c  رو هم بعد از اجرای برنامه نشون می ده. 
تقسیم رو هم فقط خارج قسمت رو نشون می ده...

----------


## Smart User

یه چیزی رو هم یادم رفت بگم !! اعداد باید بدون علامت باشن و اگه جواب منفی بشه به صورت مکمل دو نشون می ده

----------


## dostmohammady

سلام برای این که اعداد را در ارقام بالاتر دریافت کنیم نباید از بافر استفاده کنیم؟
می شه در مورد عمل تفریق منو راهنمایی کنید ممنون می شم.

----------


## Smart User

با سلام و تبریک پیشاپیش عید نوروز..

چرا باید حتما بافر بگیرید و بعد اعداد وارد شده که به حالت متنی هستند رو به هگز یا باینری تبدیل کنید... روش تبدیل عدد از نوع متنی به عدد نوع هگز هم در همه کتاب های اسمبلی هست.  تو همین تایپیک یک برنامه گذاشتم که توش یه تابع با نام ASC_TO_DEC هست. با صدازدن متوالی این تابع می تونید عددتون رو به هگز تبدیل کنید.( عدد رو از آخر به اول و دو بایتی به تابع پاس بدید )


 کدوم قسمت تفریق براتون سوال برانگیزه؟ مطلب خاصی مد نظره یا توضیح کلی میخوای؟

----------


## mehdi5106

اینم سورس برنامه ماشین حساب به زبان اسمبلی با چهار عمل اصلی:
اگه مشکلی داشت برام پیغام بزارین تا براتون اصلاح کنم.

----------


## dash feri

narmafzar asembeli ro mikham lotfan 
ki dare
bede be man mamnoonam

----------


## eL2rado

> narmafzar asembeli ro mikham lotfan 
> ki dare
> bede be man mamnoonam


 نرم افزار Emu8086 (کامپایلر اسمبلی) رو میتونی از این وبلاگ دانلود کنی:
http://assemblylanguge.blogfa.com

----------


## eL2rado

از بچه ها کسی میتونه این کد رو برام توضیح بده؟...یه دنیا تشکر.. مربوط میشه به جمع دو عدد
مخصوصا دستورات (mul dx و  sub bl,'0')
;--------------------------------------------------
asctobin proc
    push bx
    mov ax,0
continuee:
    mov bl,[si]
    cmp bl,0dh     
    jz exit
    mov dx,10
    mul dx

    sub bl,'0'
    mov bh,0
    add ax,bx
    inc si

    jmp continuee
exit:
    pop bx
    ret
asctobin endp
;-------------------
bintoasc proc
    add si,4
    mov bx,10
continue:
    mov dx,0
    div bx
    add dl,'0'
    mov [si],dl
    or ax,ax
    jz ex
    dec si
    jmp continue
ex:
    ret
bintoasc endp
;------------------------------
که قبلش به این صورته
lea si,numa     
    call asctobin
    mov bx,ax
همچنین برای numb
و در نهایت
lea si,numc
  call bintoasc

----------


## mohsenrahx

> اینم سورس برنامه ماشین حساب به زبان اسمبلی با چهار عمل اصلی:
> اگه مشکلی داشت برام پیغام بزارین تا براتون اصلاح کنم.


 


چطور میشه کامپایلش کرد؟     :متفکر:

----------


## MORTEZA66

سلام به همه دوستان 
من دقيقا برنامه اي رو كه اين دوسمون ميخواستند به عنوان پروژه درسي نوشته بودم گفته بد نيست كار اين دوسمون رو هم راه بندازم
ساده ولي مفيده

----------


## setare12

امیدوارم بتونه جواب بده

----------


## mazy007

سلام ببخشید من یه برنامه اسمبلی میخواستم که ۴ عمل اصلی رو داشته باشه و تا ۲۰ رقم بتونه کار کنه ... هیچکدوم از برنامه های صفحه های قبل میتونه بهم کمک کنه؟
ممنون

----------


## xman_1365_x

> سلام ببخشید من یه برنامه اسمبلی میخواستم که ۴ عمل اصلی رو داشته باشه و تا ۲۰ رقم بتونه کار کنه ... هیچکدوم از برنامه های صفحه های قبل میتونه بهم کمک کنه؟
> ممنون


خیر نمیتونه کمکی کنه
میتونید به صورت بیت های پشت سر هم و یا روش ساده تر هر رقم به صورت یک کاراکتر در نظر بگیرید،نمونه ضرب و جمع قبلا گفته شده 
موفق باشید

----------

