دوست عزیز، به سایت علمی نخبگان جوان خوش آمدید

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

توجه داشته باشید، در صورتی که عضو سایت نباشید نمی توانید از تمامی امکانات و خدمات سایت استفاده کنید.
نمایش نتایج: از شماره 1 تا 10 , از مجموع 81

موضوع: آموزش جامع زبان اسمبلی - Assembly

Threaded View

پست قبلی پست قبلی   پست بعدی پست بعدی
  1. #11
    کـــــــاربر فــــعال
    رشته تحصیلی
    کامپیوتر(مهندسی نرم افزار)
    نوشته ها
    18,304
    ارسال تشکر
    4,182
    دریافت تشکر: 19,008
    قدرت امتیاز دهی
    220
    Array

    پیش فرض پاسخ : آموزش جامع زبان اسمبلی - Assembly

    در اين قسمت ميخواهيم با استفاده از مطالبي كه در بخشهاي قبلي ياد گرفتيم
    برنامه اي بنويسيم كه كامل و قابل استفاده باشد . با اين برنامه ميتوانيم
    فلاپي ديسكهاي خودمان را با سرعت كپي كنيم ! امروز برنامه را به شكلي مينويسيم كه
    بتواند ديسكهاي 1.44 را بوسيله درايو A كپي كند . بيشتر نياز ما در كپي (تكثير)
    ديسكها هم به همين شكل هست . با اينحال در قسمت بعدي نگارش (Version) جديدتري از
    برنامه را مينويسيم و قابليت تشخيص نوع ديسك و قابليت مشخص كردن درايو را به آن
    اضافه ميكنيم .
    بهترين كاري كه ميتوانيم بكنيم اينست كه بتوانيم داده هاي خوانده شده از
    ديسك را در حافظه EMS بنويسيم (در اين نسخه روي هاردديسك مينويسيم ) . وقتي كه
    نحوه كار را حافظه گسترش يافته (Extended Memory) را هم ياد گرفتيم ، برنامه
    خود را كامل كرده و از آن بعنوان اولين دستختمان در برنامه نويسي اسمبلي لذت
    ميبريم .
    ليست برنامه در زير قرار دارد و توضيحات برنامه را روي آن ميبينيم
    قبل از آن ياد آوري ميكنم كه هر ديسك HD َ1.44 داراي دو طرف و در هر طرف 80 شيار
    (Track) بوده و هر شيار هم به 18 بخش بنام قطاع (Sector) تقسيم ميشود . برنامه
    ما بايد محتواي تمام اين قطاعها را خوانده و در فايلي روي ديسك سخت ذخيره كند.
    سپس همين داده ها را از فايل خوانده و مجددا روي ديسك جديد بنويسد.



    طول هر قطاع 512 بايت است EQU 512 SECTORSIZE
    تعداد شيار ها 80 شيار (79- 0-) است EQU 79 MAXTRACK
    هر ديسك دو طرف دارد EQU 2 NUMSIDES
    تعداد سكتور در هر شيار 18 تا است EQU 118 SECTOR_PER_TRACK E
    .MODEL SMALL
    .CODE
    ORG 100H
    START:
    JMP MAIN

    بافر براي ذخيره (0)BUF DB SECTORSIZE*SECTOR_PER_TRACK DUP
    داده ها . اندازه آن به اندازه بايتهاي يك شيار است
    معرف رويه فعلي ديسك SIDE D DB 0
    معرف تراك جاري TRACK DDB 0
    هندل (مشخصه ) فايل HANDLE DW 0

    اسم فايل براي دخيره موقت داده ها FILENAME DB 'C:TTEMP.$$$'/0

    MSG1 DB 'ENTER A DISK INTO DRIVE A :THEN PRESS A KEY'/13/10/'$'
    MSG2 DB 'ENTER A NEW DISK INTO DRIVE A :THEN PRESS A KEY'/13/10/'$'



    رويه ReadTrack داده هاي يك شيار را بطور كامل ميخواند . براي خواندن يك شيار
    كامل از Int 13h/Ah=02h استفاده كرده ايم . داده ها بعد از خوانده شدن در محلي
    كه با ES:BX مشخص ميشود ذخيره ميشوند . (به مرجع اينتراپيتها مراجعه كنيد) قبلا
    كار با اين وقفه را توضيح داده ايم (برنامه Boots.asm را ببينيد)


    READTRACK PROC ;READ A TRACK
    PUSH ES
    MOV AX/DS
    MOV ES/AX
    LEA BX/BUF
    MOV AH/2
    MOV DL/0 ;DRIVE A:
    MOV DH/SIDE
    MOV CH/TRACK
    MOV CL/1 ;THE 1st SECTOR
    MOV AL/SECTOR_PER_TRACK
    INT 13H
    POP ES
    RET
    READTRACK ENDP



    اين رويه داده هاي موجود در BUF را خوانده و در يك شيار كامل كه با متغير Track
    مشخص ميشود مينويسد . براي اينكار از INT 13h/AH=03h استفاده شده است . آدرس
    متغير BUF را بايد در ES:BX قرار بدهيم .


    WRITETRACK PROC
    LEA BX/BUF
    PUSH ES
    MOV AX/DS
    MOV ES/AX


    شماره تابع براي نوشتن MOV AH/03
    تعداد سكتورها براي نوشتن MOV AL/SECTOR_PER_TRACK
    شماره تراك MOV CH/TRACK
    شماره سكتور شروع MOV CL/1
    رويه ديسك (طرف ديسك ) MOV DH/SIDE
    شماره درايو كه اينجا A است MOV DL/0 INT 13H
    POP ES
    RET
    WRITETRACK ENDP


    اين پروسيجر به اندازه يك تراك كامل از فايل خوانده و در متغير BUF قرار ميدهد
    READFILE PROC
    MOV BX/HANDLE

    اندازه يك تراك MOV CX/SECTORSIZE*SECTOR_PER_TRACK
    آدرس بافر براي ذخيره كه DS:DX است LEA DX/BUF MOV AH/3FH
    INT 21H
    RET
    READFILE ENDP


    اين پروسيجر كليه داده هاي داخل BUF كه به اندازه يك تراك كامل (18*512 بايت )
    است را خوانده و در فايل مينويسد تا بعدا مجددا خوانده و روي ديسك جديد بنويسد


    WRITEFILE PROC
    MOV BX/HANDLE
    MOV CX/SECTORSIZE*SECTOR_PER_TRACK
    LEA DX/BUF
    MOV AH/40H
    INT 21H
    RET
    WRITEFILE ENDP



    منتظر ميماند تا كليدي فشرده شود WAIT PPROC
    تابع خواندن كليد MOV AH/0 INT 16H
    RET
    WAIT _ENDP



    اين رويه فايل با هندل مشخص شده را ميبندد CLOSEFILE PROC MOV AH/3EH
    MOV BX/HANDLE
    INT 21H
    RET
    CLOSEFILE ENDP


    شروع برنامه اصلي . MAIN:

    در اين قسمت اعذم ميكنيم كه ديسكي را در درايو A قرار دهده و كليدي را
    برنند . MOV AH/9
    LEA DX/MSG1
    INT 21H

    مكث براي دريافت كليد _CALL WAIT

    ساختن فايل براي ذخيره داده ها MOV AH/3CH
    LEA DX/FILENAME
    MOV CX/0
    INT 21H

    MOV SIDE/0
    MOV HANDLE/AX
    MOV TRACK/1

    موتور ديسك خوان مدت زماني لازم دارد تا به سرعت كافي برسد . بنا براين بايد
    يك يا دو بار قبل از خواندن ديسك ، تابع خواندن را اجرا كنيم تا موتور ديسك در
    حالت مناسب قرار بگيرد.
    CALL READTRACK ; START UP THE CASSETTE-MOTOR
    COPY:
    MOV TRACK/0
    COPYTRACK:

    خواندن شيار CALL READTRACK
    نوشتن داده هاي خوانده شده در ديسك CALL WRITEFILE
    شيار بعدي INC TRACK
    آيا شيار80 هستيم / CMP TRACK/80
    نه ، شيار بعدي TRACKS َ; COPY 80 JNZ COPYTRACK

    طرف بعدي ديسك INC SIDE
    آيا طرف دوم ديسك هستيم ? CMP SIDE/1
    نه ، پس ادامه بده JZ COPY
    وگر نه فايل را ببند CALL CLOSEFILE

    حالا اعلام ميكنيم كه ديسك جديد را در درايو A قرار دهد و كليدي را بزند MOV AH/09H
    LEA DX/MSG2
    INT 21H
    CALL WAIT_

    MOV SIDE/0


    همان فايل را براي خواندن باز ميكنيم . وقتي كه فايلي را ميسازيم تنها ميتوانيم
    در آن فايل بنويسيم . بنا براين براي خواندن از فايل ، بايد آن را بسته و مجددا
    براي خواندن باز كنيم . LEA DX/FILENAME
    MOV AH/3DH
    MOV AL/0
    INT 21H

    مشخصه فايل در Handle قرار ميگيرد MOV HANDLE/AX

    MOV TRACK/1
    MOV SIDE/0

    اجراي تابع نوشتن براي راه اندازي موتور ديسك CALL WRITETRACK
    WRITE:
    MOV TRACK/0
    WRITE_ON_TRACK:

    داده هارا از فايل بخوان CALL READFILE
    داده ها را روي شيار بنويس CALL WRITETRACK
    شيار بعدي INC TRACK
    آيا شيار 80 هستيم ? CMP TRACK/80
    نه ، پس ادامه بده JNZ WRITE_ON_TRACK
    بله ، طرف بعدي ديسك INC SIDE
    آيا الان طرف دوم را هم خوانده ايم ? CMP SIDE/1
    نه ، پس شيار بعدي را بنويس JZ WRITE
    بله ، فايل را ببند CALL CLOSEFILE

    فايلي كه ساخته بوديم فضائي از ديسك سخت را اشغال كرده ، بنا براين بهتر است
    آن را با استفاده از وقفه 21h و تابع 3Ah حذف كنيم . LEA DX/FILENAME
    MOV AH/3AH
    INT 21H ;ERASE THE TEMPORARY FILE
    INT 20H
    END START
    شنبه : یارب العالمین 1شنبه : یا ذاالجلال والاکرام
    2شنبه : یا قاضی الحاجات 3شنبه : یاارحم الراحمین
    4شنبه : یا حی یاقیوم 5شنبه : لا اله الا الله الملک الحق المبین
    جمعه : اللهم صل علی محمد وال محمد وعجل فرجهم

  2. 3 کاربر از پست مفید آبجی سپاس کرده اند .


اطلاعات موضوع

کاربرانی که در حال مشاهده این موضوع هستند

در حال حاضر 1 کاربر در حال مشاهده این موضوع است. (0 کاربران و 1 مهمان ها)

موضوعات مشابه

  1. مقاله: یادگیری الکترونیکی
    توسط آبجی در انجمن بخش مقالات وب و اینترنت
    پاسخ ها: 0
    آخرين نوشته: 21st February 2010, 10:59 PM
  2. مقاله: آموزش و پرورش در اسپانیا
    توسط *مینا* در انجمن علوم تربیتی
    پاسخ ها: 0
    آخرين نوشته: 20th November 2009, 10:49 PM
  3. گذری بر تاریخچه خط در ايران زمين
    توسط Admin در انجمن ایران شناسی
    پاسخ ها: 1
    آخرين نوشته: 15th March 2009, 07:24 PM

کلمات کلیدی این موضوع

مجوز های ارسال و ویرایش

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