1. مهمان گرامی، جهت ارسال پست، دانلود و سایر امکانات ویژه کاربران عضو، ثبت نام کنید.
    بستن اطلاعیه

آموزش اسمبلی(8)

شروع موضوع توسط hector2141 ‏15/10/12 در انجمن Assembly

  1. کاربر ارشد

    تاریخ عضویت:
    ‏6/9/12
    ارسال ها:
    14,323
    تشکر شده:
    2,698
    امتیاز دستاورد:
    0
    حرفه:
    daneshjo
    [​IMG]
    میخواهیم با مطالبی که خوانده ایم یک برنامه تمرینی بنویسیم . برنامه ای برای تعریف رنگهای جدید!


    اگر دارای کارت ویدئوی VGA و طبعا VGA BIOS باشید ، میتوانید از تابع ۱۰H مربوط به اینتراپت ۱۰h
    (که مربوط به سرویسهای تصویری است ) برای تعریف پالت های جدید استفاده کنید . تعداد رنگهائی که میتوان آنها را تغییر داد به نوع کارت گرافیک و VGA BIOS مربوط است و در حالت عادی رنگهای شماره ۰تا ۷ا قابل تعریف هستند .

    پالت رنگ را به این صورت باید تعریف کنیم : AH=10H
    AL=10H

    شماره رنگ از ۰تا BX= 7ا
    عدد رنگ سبز CH=
    عدد رنگ آبی CL=
    عددرنگ قرمز DH=

    رنگهائی که دیده میشود ، ترکیبی از سه رنگ اصلی قرمز،سبز و آبی (RGB) هستند .
    برای تعریف یک رنگ جدید نیز باید مقدار هر رنگ اصلی در پالت مورد نظر را در نیم ثباتهای CH/CLو DHوC قرار دهیم . این مقادیر ۶ بیتی و در محدوده ۱ تا ۶۳ هستند .
    پس از مقداردهی ثباتها اینتراپت ۱۰h را فراخوانی میکنیم . در مثال زیر ما رنگ شماره ۱ که آبی میباشد را تغییر داده ایم .

    تمرین : برنامه را برای رنگهای شماره ۲تا ۷ا نیز با مقادیر دلخواه تکمیل کنید.
    . MODEL SMALL
    . CODE
    ORG 100H
    START :
    MOV AH/010H
    MOV AL/010H
    MOV BX/1 ; COLOR NUMBER
    MOV CH/12 ; GREEN VALUE
    MOV CL/24 ; BLUE VALUE - THE 16-BIT NUMBER
    MOV DH/14 ; RED VALUE
    INT 10H ; VIDEO BIOS INT .
    INT 20H ; TERMINATE PROGRAM
    END START

    ما در اینجا وجود VGA BIOS را تست نکرده ایم و اگر این برنامه روی کامپیوتری با کارت گرافیک EGA و … اجراشود نتایج غیرقابل پیش بینی بدست خواهد آمد.
    یک راه ساده برای تست وجود کارت VGA وجود دارد . به اینصورت که مقدار ثباتهای AH و ALو را به ترتیب برابر ۱Ah و ۰۰h قرار داده و اینتراپت ۱۰h را اجرا میکنیم. اگر بعد از فراخوانی وقفه ، AL برابر ۱Ah بود یعنی کارت VGA فعال است .
    پس در برنامه ای که نوشتیم میتوانیم با یک دستور CMP ساده از بوجود آمدن خطای نبود VGA BIOS جلوگیری کنیم .
    بنا براین برنامه را به این صورت تکمیل میکنیم :

    . MODEL SMALL
    . CODE
    ORG 100H ; BEGINING OFFSET : 100H
    START :

    MOV AH/1AH
    این قسمت را | MOV AL/00
    اضافه کرده ایم | INT 10H CMP AL/1AH ; VGA BIOS EXIST? |

    ; NO UJUMP TO THE END JNZ NOVGA
    MOV AH/010H
    MOV AL/010H
    MOV BX/1 ; COLOR NUMBER
    MOV CH/12 ; GREEN VALUE
    MOV CL/24 ; BLUE VALUE - THE 16-BIT NUMBER
    MOV DH/14 ; RED VALUE
    INT 10H ; VIDEO BIOS INT.
    NOVGA:
    INT 20H ; TERMINATE PROGRAM
    END START

    در برنامه بالا اگر بعد از اجرای وقفه ۱۰h مقدار AL برابر ۱Ah نباشد، نمیتوانیم از سرویس تعریف رنگ استفاده کرده و مجبوریم برنامه را با پرش به NOVGA خاتمه دهیم .
    در این قسمت با نوشتن یک برنامه ، دو تابع مفید از وقفه ۱۰h را یاد گرفتیم و دیدیم که نوشتن یک برنامه اسمبلی برخلاف آنچه تا بحال تصور میکردیم چقدر ساده و جالب است .
    پیروز باشید.