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

نام تاپیک: درخواست كمك فوري توضيح چند خط از برنامه ماشين حساب زير

  1. #1

    درخواست كمك فوري توضيح چند خط از برنامه ماشين حساب زير

    سلام. من تو خطهاي زير از برنامه مشكل دارم. لطفا كمك كنيد خيلي واجبه

    1) dalile pop kardane ax bx dx (khate 36-38)
    2) khate 48 : chera mul si? va inke chetori si ba bx zarb mishe?
    3) 51 : chera sub dl,48 ?
    setare_asemooniii: 52 : chera add ax,dx ?
    4) chera div si ? va chera natije mire dakhele bx ?
    5) 73 : chera or ax,ax ?
    6) 76 : chera add dl,48 ?
    7) 80 : mov byte ptr[bx],$ manzoor az $ chiye? karesh chiye

    data segment                               
    temp db 10 dup(0)
    str db 'Please Enter Number1:',"$"
    str1 db 'Please Enter Operator:',"$"
    str2 db 'Please Enter Number2:' ,"$"
    str3 db 'result:',"$"
    str4 db 'invalid operator',"$"
    num1 dw ?
    num2 dw ?
    result dw ?
    operator db ?
    data ends

    code segment
    assume cs:code,ds:data
    ;------------------------------------getnumber-------------------------------------------------------------------------------------------
    getnum proc
    push ax
    push bx
    push dx
    again: mov ah,8
    int 21h
    cmp al,13
    je finish
    cmp al,'0'
    jl again
    cmp al,'9'
    jg again
    mov [bx],al
    inc bx
    mov dl,al
    mov ah,2
    int 21h
    jmp again
    finish:mov [bx],al
    pop dx
    pop bx
    pop ax
    ret
    getnum endp
    ;-------------------------------------------asctobin-------------------------------------------
    asctobin proc
    push bx
    push si
    push dx
    mov si,10
    mov ax,0
    next: mul si
    mov dl,[bx]
    inc bx
    sub dl,48
    add ax,dx
    cmp byte ptr[bx],13
    jne next
    pop dx
    pop si
    pop bx
    ret
    asctobin endp
    ;------------------------------------------bintoasc-----------------------------------------------
    bintoasc proc
    push cx
    push dx
    push si
    push bx
    push ax
    mov si,10
    xor cx,cx
    next2: xor dx,dx
    div si
    push dx
    inc cx
    or ax,ax
    jnz next2
    l1: pop dx
    add dl,48
    mov [bx],dl
    inc bx
    loop l1
    mov byte ptr[bx],'$'
    pop ax
    pop bx
    pop si
    pop dx
    pop cx
    ret
    bintoasc endp
    ;------------------------------------------------amaliat---------------------------------------------------
    amaliat proc
    mov ax,num1
    mov bx,num2
    mov dl,operator
    cmp dl,'+'
    jne menha
    add ax,bx
    ret
    menha: cmp dl,'-'
    jne zarb
    sub ax,bx
    ret
    zarb: cmp dl,'*'
    jne taghsim
    mul bx
    ret
    taghsim: cmp dl,'/'
    jne invalid
    sub dx,dx
    div bx
    ret
    invalid:
    lea dx,str4
    mov ah,9h
    int 21h

    ret
    amaliat endp
    ;------------------------------------------------------------MAIN---------------------------------------------------------
    main proc
    mov ax,data
    mov ds,ax

    lea dx,str
    mov ah,9h
    int 21h
    lea bx,temp
    call getnum
    call asctobin
    mov num1,ax

    lea dx,str1
    mov ah,9h
    int 21h

    mov ah,1
    int 21h
    mov operator,al

    lea dx,str2
    mov ah,9h
    int 21h

    call getnum
    call asctobin
    mov num2,ax
    call amaliat
    mov result,ax


    lea dx,str3
    mov ah,9h
    int 21h


    mov ax,result
    call bintoasc
    mov dx,bx
    mov ah,9
    int 21h

    ;************************************************* ****************
    ;exit
    mov ah,4ch
    int 21h
    main endp
    code ends
    end main

  2. #2

    نقل قول: درخواست كمك فوري توضيح چند خط از برنامه ماشين حساب زير

    خواهشا يكي كمكم كنه.
    بدجوري لنگم

  3. #3

    نقل قول: درخواست كمك فوري توضيح چند خط از برنامه ماشين حساب زير

    0-فارسي تايپ كنيد!(ويرايش كنيد پستتون رو) و پروژه دانشجويي رو خودتون زحمت بكشيد.
    1-دليلش براي ذخيره كردن ثبات هاي مذكور هست (شايد بعد از اين تابع بهشون نياز باشه نمي خوايم مقدارشون با فراخواني تابع و در تابع تغيير كنه)كه با push كردن در خط هاي 18-20 ثبات هارو در پشته ذخيره ميكنه و در پايان تابع مقادير اون ثبات هارو از پشته فراخواني ميكنه
    2-چرا كه نه؟ با اون ضرب نميشه جمع ميشه!
    كار اون پروسيجر اينه كه براي تبديل كردن رشته عددي كه گرفتيم تبديل كنيم به عدد تا بتونيم راحت محاسبات رو انجام بديم!براي اين كارم ميدونيم هر رقم ارزش مكاني داره و براي اين اومده در 10 ضرب كرده و چك ميكنه آخر رشت به اينتر رسيده يا نه تا زماني كه نرسيده در 10 ضرب و با رقم هاي وارد شده جمع ميكنه
    3-براي تبديل اسكي به باينري و بلعكسش بايد با اون جمع كنيد!(كاربردش اينه شما براي محاسبات نياز به باينري دارين و براي اينكه بتونين روي صفحه نمايش نشون بدين به كد اسكي اون عدد نياز دارين)
    خط 52 حد اقل قبلش آي دي بنده خدا رو پاك ميكردين اين خط براي جمع كردن رقم هاي وارد شده و جمع با ارزش مكاني عدد هست كه بالا توضيح دادم.
    4-خوب بلعكس پروسيجر قبلي هست براي اينكه ارزش مكاني بدست بياره و عدد رو رقم رقم جدا كنه تا بتونه توي صفحه نمايش نشون بده بايد بر 1ده تقسيم كنه و اينكه نتيجه داخل bx نميره بلكه bx اشارهگر هست كه آدرس temp رو در خودش داره كه در پروسيجر main تعريف شده و مقدير رو بعد از تبديل به اسكي در اون ذخيره ميكنه تا بعد نمايش بده
    5-وقتي داريم برعكس انجام ميديم براي اينكه متوجه شيم رقم هامون تموم شده و ديگه نبايد تقسيم كنيم(شرط پايان حلقه) موقعي هست كه ax صفر ميشه
    (اگر متوجه نشدين ميتونيد يك عدد رو متوالي بر ده تقسيم كنيد ببينيد كي صفر ميشه)
    6-قبلا گفتم براي تبديل باينري به اسكي تا بشه روي صفحه نمايش داد(ترس نداشته باشين اون خط رو كامنت كنيد ببنيد چه چيزي چاپ ميشه
    7-منظوري نداره شما ببخشيد، براي چاپ كردن رشته روي صفحه با وقفه int21,ah=9 پايان رشته كاراكتر دالر هست پس از جايي كه آدرس temp هست تا زماني كه به دالر برسه برروي صفحه نمايش ميده اگر ميخواست اين كارو انجام نده بايد يكي يكي هر كاراكتر رو نمايش ميداد و لي بايد طول رشترو ميدونستيم كه اين روش كندتر هست و با وقفه int32,ah=2 انجام ميشه
    مزاح هايي هم كه در متن بود براي لبخند زدن پس دلگير نشين
    موفق باشي

  4. #4

    نقل قول: درخواست كمك فوري توضيح چند خط از برنامه ماشين حساب زير

    نقل قول نوشته شده توسط xman_1365_x مشاهده تاپیک
    0-فارسي تايپ كنيد!(ويرايش كنيد پستتون رو) و پروژه دانشجويي رو خودتون زحمت بكشيد.
    1-دليلش براي ذخيره كردن ثبات هاي مذكور هست (شايد بعد از اين تابع بهشون نياز باشه نمي خوايم مقدارشون با فراخواني تابع و در تابع تغيير كنه)كه با push كردن در خط هاي 18-20 ثبات هارو در پشته ذخيره ميكنه و در پايان تابع مقادير اون ثبات هارو از پشته فراخواني ميكنه
    2-چرا كه نه؟ با اون ضرب نميشه جمع ميشه!
    كار اون پروسيجر اينه كه براي تبديل كردن رشته عددي كه گرفتيم تبديل كنيم به عدد تا بتونيم راحت محاسبات رو انجام بديم!براي اين كارم ميدونيم هر رقم ارزش مكاني داره و براي اين اومده در 10 ضرب كرده و چك ميكنه آخر رشت به اينتر رسيده يا نه تا زماني كه نرسيده در 10 ضرب و با رقم هاي وارد شده جمع ميكنه
    3-براي تبديل اسكي به باينري و بلعكسش بايد با اون جمع كنيد!(كاربردش اينه شما براي محاسبات نياز به باينري دارين و براي اينكه بتونين روي صفحه نمايش نشون بدين به كد اسكي اون عدد نياز دارين)
    خط 52 حد اقل قبلش آي دي بنده خدا رو پاك ميكردين اين خط براي جمع كردن رقم هاي وارد شده و جمع با ارزش مكاني عدد هست كه بالا توضيح دادم.
    4-خوب بلعكس پروسيجر قبلي هست براي اينكه ارزش مكاني بدست بياره و عدد رو رقم رقم جدا كنه تا بتونه توي صفحه نمايش نشون بده بايد بر 1ده تقسيم كنه و اينكه نتيجه داخل bx نميره بلكه bx اشارهگر هست كه آدرس temp رو در خودش داره كه در پروسيجر main تعريف شده و مقدير رو بعد از تبديل به اسكي در اون ذخيره ميكنه تا بعد نمايش بده
    5-وقتي داريم برعكس انجام ميديم براي اينكه متوجه شيم رقم هامون تموم شده و ديگه نبايد تقسيم كنيم(شرط پايان حلقه) موقعي هست كه ax صفر ميشه
    (اگر متوجه نشدين ميتونيد يك عدد رو متوالي بر ده تقسيم كنيد ببينيد كي صفر ميشه)
    6-قبلا گفتم براي تبديل باينري به اسكي تا بشه روي صفحه نمايش داد(ترس نداشته باشين اون خط رو كامنت كنيد ببنيد چه چيزي چاپ ميشه
    7-منظوري نداره شما ببخشيد، براي چاپ كردن رشته روي صفحه با وقفه int21,ah=9 پايان رشته كاراكتر دالر هست پس از جايي كه آدرس temp هست تا زماني كه به دالر برسه برروي صفحه نمايش ميده اگر ميخواست اين كارو انجام نده بايد يكي يكي هر كاراكتر رو نمايش ميداد و لي بايد طول رشترو ميدونستيم كه اين روش كندتر هست و با وقفه int32,ah=2 انجام ميشه
    مزاح هايي هم كه در متن بود براي لبخند زدن پس دلگير نشين
    موفق باشي
    مرسي واقعا.
    خيلي مفيد و كامل بود. ممنون
    ببخشيد باز يه مشكلي:
    چرا وقتي مينويسيم mul si ميگيد جمع ميشه؟ مگه mul ضرب نيست؟ هميشه mul si در 10 ضرب ميشه؟ و اينكه هميشه mul si با bx جمع ميشه؟ حالا چرا bx؟ چرا dx نه؟

    براي div si هم همينطور. چرا div si داخل اشاره گر bx ميره؟
    آيا همه اينها برميگرده به push كردن اين متغيرها؟

  5. #5

    نقل قول: درخواست كمك فوري توضيح چند خط از برنامه ماشين حساب زير

    ببخشيد باز يه مشكلي:
    چرا وقتي مينويسيم mul si ميگيد جمع ميشه؟ مگه mul ضرب نيست؟ هميشه mul si در 10 ضرب ميشه؟ و اينكه هميشه mul si با bx جمع ميشه؟ حالا چرا bx؟ چرا dx نه؟

    براي div si هم همينطور. چرا div si داخل اشاره گر bx ميره؟
    آيا همه اينها برميگرده به push كردن اين متغيرها؟
    سوال شما اين بود(كه اديت هم نكردين )
    2) khate 48 : chera mul si? va inke chetori si ba bx zarb mishe?
    كد قسمت مربوطه

    mov si,10
    mov ax,0
    next: mul si
    mov dl,[bx]
    inc bx
    sub dl,48
    add ax,dx
    cmp byte ptr[bx],13
    jne next

    اين قسمت مجموعه اي از دستورات هست و نه يك دستور
    توضيحات من كافي بود شما دقت نكردين، ببينيد درسته كه mul ضرب هست و داره تا زماني كه شرط به پايان نرسيده ax*si ضرب ميشه اما اين بين اگر هزار بارم در ax=0 ضرب كنيم ax=0 ميمونه حالا در خط هاي بعد يك كاراكتر از رشته اي كه داشتيم ميريزه توي dl و اون رو از 48 كم ميكنه تبديل به عدد ميشه و حالا اين با ax+dl جمع مي كنه و حالا ax نامساوي با صفر و در شروع مجدد در 10 هم ضرب ميشه تا وقتي كه به كد اسكي اينتر برسه نتيجه حاصل عددي كه شما به صورت رشته كاراكتري وارد كرده بودين هست.
    براي درك بهتر شما و دوستان ديگر بزارين اينم بگم براي مثال شما يك رشته دريافت كردين

    temp db '1','2','3'
    temp2 db "123"

    دو كد بالا يكسان هست و اينها به عنوان مثال رشته كاراكتري هست كه شما با وقفه دريافت كردين
    حالا اين ها با كد اسكي در حافظه به صورت بايت هاي پشت هم قرار ميگيرند يعني

    temp db 49,50,52
    temp2 db 49,50,52

    حالا براي تبديل اول ميايم از 48 كم مي كنيم تا معادل عددي بشه كم كنيد ميبينيد!
    ولي مشكل بعد چيه؟ اونها عدد هايي تك رقمي و جدا از هم هستن كه
    (1*10^2)+(2*10^1)+(10^0+3)=123

    پس خروجي برنامه شما همينه و بعد از اينكه شما محاسبات رو انجام ميدين بخواين روي صفحه نمايش نشون بدين همين روند رو معكوس ميكنيم بر 10 تقسيم ميكنيم و با 48 جمع و بعد نمايش ميديم همين

    موفق باشي
    آخرین ویرایش به وسیله xman_1365_x : یک شنبه 29 خرداد 1390 در 06:54 صبح

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

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