نمایش نتایج 1 تا 4 از 4

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

  1. #1

    Question مشکل در جمع دو عدد به زبان اسمبلی

    درود ، به همه دوستان ، بنده با برنامه emu8086 یک برنامه جمع نوشتم که موقع اجرا این پیغام رو میده .





    ممنون میشم راهنمایی کنید مشکل کجاست ؟

    کد :
    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

  2. #2
    کاربر دائمی آواتار vahid-p
    تاریخ عضویت
    آذر 1391
    محل زندگی
    تهران
    پست
    1,140

    نقل قول: مشکل در جمع دو عدد به زبان اسمبلی

    برنامتون مشکلی نداره. اون پیام هم اررور نیست. بعد از این اینتراپت ها چنین پیامی رو بهتون میده. داره میگه کنترل به سیستم عامل برگشت داده شد و این معادل همون 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

  3. #3

    نقل قول: مشکل در جمع دو عدد به زبان اسمبلی

    نقل قول نوشته شده توسط vahid-p مشاهده تاپیک
    برنامتون مشکلی نداره. اون پیام هم اررور نیست. بعد از این اینتراپت ها چنین پیامی رو بهتون میده. داره میگه کنترل به سیستم عامل برگشت داده شد و این معادل همون 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
    دوست عزیز باز هم برنامه اجرا نشد ، یعنی اون کادر مشکی رنگ نمیاد که خروجی رو نشون بده و همون پیغام قبلی رو میده .چه کنم ؟

  4. #4
    کاربر دائمی آواتار vahid-p
    تاریخ عضویت
    آذر 1391
    محل زندگی
    تهران
    پست
    1,140

    نقل قول: مشکل در جمع دو عدد به زبان اسمبلی

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

    اونی که من گفتم خروجیش تو ریجسترها میتونستید ببینید.
    موفق باشید
    آخرین ویرایش به وسیله vahid-p : پنج شنبه 04 اردیبهشت 1393 در 00:03 صبح

تاپیک های مشابه

  1. ضرب و جمع دو عدد به زبان ماشین
    نوشته شده توسط armini در بخش برنامه نویسی با زبان C و ++C
    پاسخ: 0
    آخرین پست: چهارشنبه 15 آذر 1391, 18:18 عصر
  2. سوال: جمع دو عدد در زبان اسمبلي
    نوشته شده توسط SASAQW در بخش برنامه نویسی اسمبلی خانواده x86
    پاسخ: 1
    آخرین پست: شنبه 13 خرداد 1391, 11:25 صبح
  3. سوال: مشکل در جمع دو عدد
    نوشته شده توسط alih110 در بخش PHP
    پاسخ: 3
    آخرین پست: سه شنبه 29 دی 1388, 16:03 عصر
  4. سوال: چند سوال در مورد جمع دو عدد n رقمی در زبان C
    نوشته شده توسط farzad.sharifi در بخش برنامه نویسی با زبان C و ++C
    پاسخ: 7
    آخرین پست: جمعه 17 خرداد 1387, 16:05 عصر
  5. جمع دو عدد اعشاری در اسمبلی
    نوشته شده توسط miracle در بخش برنامه نویسی اسمبلی خانواده x86
    پاسخ: 14
    آخرین پست: دوشنبه 04 دی 1385, 00:46 صبح

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •