# برنامه نویسی سطح پایین > برنامه نویسی اسمبلی خانواده x86 >  مقاله : وقفه ها ؟

## Delphi Skyline

وقفه ها - قسمت اول
* 
*  مقاله زیر ترجمه بنده از قسمتی از هلپ برنامه Emulator 8086 دوباره نوشته شده توسطDaniel B. Sedory (aka The Starmanمی باشد . البته قسمت هایی را از جمله توضیحات اول مقاله , برخی مثال ها و بعضی توضیحات را خودم اضافه نموده ام .


-وقفه چیست ؟
اول از همه باید دانست که وقفه یا interrupt چیست : وقفه ها مانند API های ویندوز هستند . یعنی دستوراتی از قبل نوشته شده که برای استفاده از آنها تنها کاری را که باید انجام داد فراخوانی آنهاست . کلیه وقفه های ذکر شده هماهنگ با کامپیوتر های IBM و پردازنده های x86( پردازنده های 8086 اینتل و پردازنده های سازگار AMD ) می باشند . البته بیشتر این وقفه ها بر روی پردازنده های جدید تر نیز قابل اجرا می باشد . برای کامپایل کردن برنامه ها به کامپایلر های MASM یا TASM و یا FASM   16 بیتی نیاز دارید . 

چرا می گوییم وقفه ؟
در واقع وقفه ها وقتی اجرا می شود فعالیت دیگر برنامه ها را متوقف کرده و خود اجرا می شوند .

-انواع وفقه ها :
وقفه ها دو نوع هستند :
1 – وقفه هایی که عملکرد آنها شبیه به روال ها هستند یعنی اینکه عملی را انجام داده ولی مقداری را بر نمی گردانند (شبیه Procedure  در دلفی) .
2 – وقفه هایی که عملکرد آنها شبیه توابع بوده و مقداری را بر میگردانند ولی عملی را در واقع انجام نمی دهند (شبیه Function در دلفی) .

فراخوانی وققه ها :
هر وقفه پارامتر هایی دارد که اول باید آنها را مقدار دهی کرد البته پارامتر نه به آن شکل بلکه برای مقداری دهی به پارامتر ها باید مقادیر را در  ثبات های (REGISTERS) خاصی   قرار داد . سپس نوع کار وقفه را در ثباتی قرار می دهیم .
و در آخر با استفاده از دستور INT وقفه مورد نظر را اجرا می کنیم .
نمونه ای از استفاده وقفه ها :

    mov al, 13h
mov ah, 0
int 10h

این ثبات که کار آن تعیین حالت ویدیویی است دارای یک پارامتر می باشد که باید آن را در ثبات al (قسمت پایینی ثبات  ax) قرار داد و نوع کار وقفه که تعیین حالت ویدیویی است را در ah (قسمت بالایی ax)  قرار می دهیم . قرار دادن 0 در ah به معنی تعیین حالت ویدویی است . و در دستور سوم وقفه 10h را اجرا می کنیم ( توجه کنید ما با قرار دادن 0 در ah نوع کار وقفه 10h را تعیین حالت ویدویی کردیم اما اگر 0 را در ah قرار داده ولی وقفه دیگری مثل 21h را اجرا کنیم نوع کار فرق می کند و دیگر تعیین حالت ویدویی نیست ) .

حالا به معرفی چندین وقفه و کار های آنها خواهیم پرداخت :


-وقفه 10h

تعیین حالت ویدویی :
برای فهماندن کار تعیین حالت ویدویی به وقفه 0 را در ah قرار دهید .
پرارامتر ها :
اگر al را برابر با 00h قرار دهید :
حالت متنی شده . 40x25 کاراکتر می شود . 16 رنگ . 8 صفحه .
اگر al را برابر با 03h قرار دهید :
حالت متنی شده . 80x25 کاراکتر می شود . 16 رنگ . 8 صفحه .

اگر al را برابر با 13h قرار دهید :
مد گرافیکی فعال می شود . 40x25 کاراکتر می شود . 256 رنگ . 1 صفحه .
و وضوح تصویر 320x200 پیکسل می شود .

مثال :
تعیین حالت متنی 40x25 کاراکتر :

*mov al, 00h
mov ah, 0
int 10h*

تعیین موقعیت مکان نما متن :
Ah را 2 قرار داده .
ورودی ها (پارامتر ها) :
DH : شماره ردیف (Xکاراکتری) .
DL : شماره ستون (Yکاراکتری) .
BH : شماره صفحه (از 0 تا 7) . اگر حالت گرافیکی فعال است شماره صفحه باید همیشه 0 باشد .

مثال : 
بردن مکان نما به ردیف 4 و ستون 5 در صفحه 0 :

 *mov dh, 4
mov dl, 5
mov bh, 0
mov ah, 2
int 10h*


تعیین صفحه جاری :
Ah را 05h قرار داده.
ورودی ها :
AL : شماره صفحه (0 تا 7) .

مثال :
انتخاب کردن صفحه 3 :

*Mov bh,3
Mov ah,03h
INT 10h*

تغییر دادن رنگ یک پیکسل از صفحه :
نکته : برای اجرای این وقفه باید مد گرافیکی فعال باشد .
Ah را 0Ch قرار داده .
ورودی ها :
AL : رنگ پیکسل .
CX : Y
DX : X

 سیاه  :  0000b  :  0h
آبی  :  0001b  :  1h
سبز  :  0010b  :  2h
قهوه ای  :  0110b  :  6h
خاکستری روشن  :  0111b  :  7h
خاکستری تیره  :  1000b  :  8h
آبی روشن  :  1001b  :  9h
سبز روشن  :  1010b  :  Ah
زرد  :  1110b  :  Eh
سفید  :  1111b  :  Fh
قرمز  :  0100b  :  4h
قرمز روشن  :  1100b  :  Ch

مثال :
تغییر دادن رنگ پیکسل 4,5 به قهوه ای (0110b) :
نکته : اول باید مد گرافیکی را فعال کرد .

    ;*set graphics video mode.    
    mov al, 13h
    mov ah, 0
    int 10h     ; 
    ;change pixel color
    mov al, 0110b
    mov cx, 5
    mov dx, 4
    mov ah, 0ch
int 10h* 

بدست آوردن رنگ یک پیکسل :
Ah را 0Dh قرار داده .
ورودی :
CX : Y
DX : X
خروجی :
بعد از اجرای این وقفه , مقدار AL برابر با رنگ پیکسل مورد نظر می شود .

مثال :
بدست آوردن رنگ پیکسل 7,8 :

*    mov cx, 8
mov dx, 
int 10h* 

با اجرای این برنامه مقدار AL برابر با شماره رنگ پیکسل 7,8 می شود .
نکته : شماره رنگ در AL مبنای دو می باشد .

نمایش یک کاراکتر :
AH را 0Eh قرار می دهیم .
ورودی :
AL : کارکتری که می خواهد چاپ شود .
نکته 1 : کاراکتر باید بین دو ' قرار گیرد . به عنوان مثال : 'A'
نکته 2 : این وقفه فقط برای نمایش یک کاراکتر است و نمی تواند رشته(String)   چاپ کند .
نکته 3 : در برخی سیستم ها این وقفه در حالت گرافیکی کار نمی کند .

مثال :
چاپ Hello! :
*    mov al, 'H'
    mov ah, 0eh
    int 10h

    mov al, 'e'
    mov ah, 0eh
    int 10h
*
*    mov al, 'l'
    mov ah, 0eh
    int 10h

    mov al, 'l'
    mov ah, 0eh
    int 10h
*
*    mov al, 'o'
    mov ah, 0eh
    int 10h

    mov al, '!'
    mov ah, 0eh
    int 10h
*

----------


## JakvarSystem

آقا خیلی ممنون .
ولی اگه یه کم آموزش هات رو بیشتر کنی بهتره.
دمت گرم.

----------


## fazlnet

اين چيزا مشكلي براي يادگيري ندارن چون تو اينترنت ميه پيدا كرد. حالا كه داري زحمت ميكشي اين چيزا رو تو محيط 32بيت آموزش بده
موفق باشي

----------


## Delphi Skyline

الان که فرصت نوشتن مقاله رو ندارم . ولی تابستون روی یه مقاله جامع در باره مبحث مد حفاظت شده کار می کردم . هر وقت تمام شد تقدیم دوستان خواهم کرد . 
روز خوش .

----------


## khafan_bat

احسنت عزیز

problem ما حل شد. understand شدیم.

----------


## tdkhakpur

> البته بیشتر این وقفه ها بر روی پردازنده های جدید تر نیز قابل اجرا می باشد


و توضیح اینکه نوع وقفه به پردازنده ارتباطی ندارد بلکه همگی در اخر کار به وقفه های بایوس(وقفه های به غیر از بایوس) و در نهایت به کد های صفر و یک تبدیل میشوند تا مورد اجرا قرار گیرند.

----------

