View Full Version : سوال: مشکل در جمع دو عدد به زبان اسمبلی
Bvk_programmer
جمعه 16 اسفند 1392, 14:38 عصر
درود ، به همه دوستان ، بنده با برنامه emu8086 یک برنامه جمع نوشتم که موقع اجرا این پیغام رو میده .
http://up98.ir/uploads/139419225337341.png
http://up98.ir/uploads/139419225342162.png
ممنون میشم راهنمایی کنید مشکل کجاست ؟
کد :
STSEG SEGMENT
DB 64 DUP(?)
STSEG ENDS
DTSEG SEGMENT
NUMBER1 DB 52H
NUMBER2 DB 29H
SUM DB ?
DTSEG ENDS
CDSEG SEGMENT
MAIN PROC FAR
ASSUME:CD:CDSEG,DS:DTSEG,SS:STSEG
MOV AX,DTSEG
MOV DS,AX
MOV AL,NUMBER1
MOV BL,NUMBER2
ADD AL,BL
MOV SUM,AL
MOV AH,4CH
INT 21H
MAIN ENDP
CDSEG ENDS
END MAIN
vahid-p
جمعه 16 اسفند 1392, 22:00 عصر
برنامتون مشکلی نداره. اون پیام هم اررور نیست. بعد از این اینتراپت ها چنین پیامی رو بهتون میده. داره میگه کنترل به سیستم عامل برگشت داده شد و این معادل همون return 0 تو سی برای main هست. یعنی برنامه به انتها رسیده.
پس برنامتون مشکلی نداره. ولی توصیه میکنم برنامتون رو مرتب تر بنویسید. شما پشته ( Stack ) و بخش های دیگه رو ناخوانا و البته همش رو وابسته به سیستم اسمبلر کردید در صورتی که باید مرتب تر نوشته بشه تا با انواع اسمبلر ها کار کنه. من مرتبش کردم به این صورت : ( جلو ASSUME نوشتید CD که درستش CS است : CODE SEGMENT )
ضمنا Procedure تون رو هم حذف کردم چون برای شاخه اصلی لزومی نداشت. ضمنا بهتره برای سگمنت هاتون، برای استک از استک و برای بقیه از PUBLIC استفاده کنید. البته اینجا چون من پروسیجر رو حذف کردم عملا استک کاربردی نداره ولی بگو باشه اشکال نداره.
DTSEG SEGMENT PARA PUBLIC 'DATA'
NUMBER1 DB 52H
NUMBER2 DB 29H
SUM DB ?
DTSEG ENDS
CDSEG SEGMENT PARA PUBLIC 'CODE'
ASSUME: CS:CDSEG,DS:DTSEG,SS:STSEG
MAIN:
MOV AX,DTSEG
MOV DS,AX
MOV AL,NUMBER1
MOV BL,NUMBER2
ADD AL,BL
MOV SUM,AL
MOV AH,04CH
INT 21H
CDSEG ENDS
STSEG SEGMENT PARA STACK 'STACK'
DB 64 DUP(?)
STSEG ENDS
END MAIN
Bvk_programmer
شنبه 17 اسفند 1392, 20:10 عصر
برنامتون مشکلی نداره. اون پیام هم اررور نیست. بعد از این اینتراپت ها چنین پیامی رو بهتون میده. داره میگه کنترل به سیستم عامل برگشت داده شد و این معادل همون return 0 تو سی برای main هست. یعنی برنامه به انتها رسیده.
پس برنامتون مشکلی نداره. ولی توصیه میکنم برنامتون رو مرتب تر بنویسید. شما پشته ( Stack ) و بخش های دیگه رو ناخوانا و البته همش رو وابسته به سیستم اسمبلر کردید در صورتی که باید مرتب تر نوشته بشه تا با انواع اسمبلر ها کار کنه. من مرتبش کردم به این صورت : ( جلو ASSUME نوشتید CD که درستش CS است : CODE SEGMENT )
ضمنا Procedure تون رو هم حذف کردم چون برای شاخه اصلی لزومی نداشت. ضمنا بهتره برای سگمنت هاتون، برای استک از استک و برای بقیه از PUBLIC استفاده کنید. البته اینجا چون من پروسیجر رو حذف کردم عملا استک کاربردی نداره ولی بگو باشه اشکال نداره.
DTSEG SEGMENT PARA PUBLIC 'DATA'
NUMBER1 DB 52H
NUMBER2 DB 29H
SUM DB ?
DTSEG ENDS
CDSEG SEGMENT PARA PUBLIC 'CODE'
ASSUME: CS:CDSEG,DS:DTSEG,SS:STSEG
MAIN:
MOV AX,DTSEG
MOV DS,AX
MOV AL,NUMBER1
MOV BL,NUMBER2
ADD AL,BL
MOV SUM,AL
MOV AH,04CH
INT 21H
CDSEG ENDS
STSEG SEGMENT PARA STACK 'STACK'
DB 64 DUP(?)
STSEG ENDS
END MAIN
دوست عزیز باز هم برنامه اجرا نشد ، یعنی اون کادر مشکی رنگ نمیاد که خروجی رو نشون بده و همون پیغام قبلی رو میده .چه کنم ؟
vahid-p
چهارشنبه 03 اردیبهشت 1393, 23:49 عصر
دوست عزیز الان شاید خیلی دیر باشه که جوابتون رو میدم، ولی قرار نیست اصلا اون صفحه مشکی بیاد. شما دارید کد اسمبلی مینویسید و الان با ریجستر ها کار میکنید. شما اگر به مقدار ریجسترهای emu نگاه کنید تغییرات رو قدم به قدم مشاهده کنید. برای اون صفحه مشکلی که میگید باید از اینتراپت استفاده کنید و نمایش دادنش خودش کلی دردسر داره. مثل C نیست که بنویسید printf خودش نشون بده. اینجا باید حتی نشون دادنش رو با اینتراپت های مجاز انجام بدید. مثلا برای یک عدد باید با تقسیم های متوالی، رقم هاش رو جدا کنید و هر رقم رو از پر ارزش به کم ارزش بنویسید. مثلا برای نشون دادن عدد 5 باید بنویسید :
mov dl,5
add dl,'0'
mov ah,2
int 21h
برای نشون دادن تک کاراکتر باید مقدار ah رو 2 بذارید و از int 21h استفاده کنید. برخیش رو میتونی از قسمت خود نرم افزار emu 8086 از تو منو help قسمت documentation and tutorials و از صفحه ای که باز میشه short list of supported interrupte functions رو انتخاب کن، و اونجا انواع اینتراپتها و فانکشن ها رو همراه با مثال میبینی. پیشنهاد میشه اول با INT 21h کار کن که یادگیریش راحتتره.
اونی که من گفتم خروجیش تو ریجسترها میتونستید ببینید.
موفق باشید
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.