# برنامه نویسی سطح پایین > برنامه نویسی اسمبلی خانواده x86 > سوال: توضیح یه تیکه کد

## ali-iman

سلام وقتتون بخیر میشه این برنامه رو خط به خط توضیح بدین.ممنون
asm.jpg

----------


## the king

> سلام وقتتون بخیر میشه این برنامه رو خط به خط توضیح بدین.ممنون



NAME    "vga"

نامی که برای برنامه در نظر گرفته شده vga است.


ORG    100h

در فایل های اجرایی COM آدرس شروع کد 100h است.


    JMP    code

به موقعیتی که با برچسب code مشخص شده پرش می کنیم.


w    EQU 10

یک مقدار ثابت با نام w و مقدار 10 تعریف می کنیم.


h    EQU 5

یک مقدار ثابت با نام h و مقدار 5 تعریف می کنیم.


code:

این موقعیت از کد با برچسب code مشخص شده است.


    MOV    AH, 0

در ادامه قصد داریم سرویس 0 از وقفه 10h را اجرا کنیم که مود صفحه نمایش را تغییر می دهد. شماره سرویس در AH مشخص می شود.


    MOV    AL, 13h

مود گرافیکی برای سرویس 0 از وقفه 10h در AL مشخص می شود. ما مود شماره 13h را انتخاب کرده ایم که مود گرافیکی 320x200 پیکسلی 256 رنگ است.


    INT    10h

وقفه 10h را اجرا می کنیم تا مود گرافیکی شماره 13h فعال شود.


    MOV    CX, 100+w

در ادامه وقفه 0Ch ار وقفه 10h را اجرا خواهیم کرد که رنگ یک پیکسل در صفحه نمایش را تغییر می دهد. شماره ستون آن پیکسل (محور x) در CX مشخص می شود که ما w + 100 را برایش انتخاب می کنیم.


    MOV    DX, 20

شماره سطر پیکسل (محور y) برای سرویس 0Ch از وقفه 10h در DX مشخص می شود که ما مقدار 20 را برایش انتخاب می کنیم.


    MOV    AL, 15

شماره رنگ پیکسل در AL مشخص می شود که ما مقدار 15 را انتخاب می کنیم.


u1:

برچسب این موقعیت از کد u1 است.


    MOV    AH, 0ch

سرویس 0Ch را انتخاب می کنیم که باید در AH ثبت شود.


    INT    10h

وقفه 10h را اجرا می کنیم تا پیکسلی که در موقعیت CX افقی و DX عمودی قرار دارد به رنگ AL شود.


    DEC    CX

مقدار CX که موقعیت افقی پیکسل را مشخص می کند یک واحد کم می کنیم، یعنی یک پیکسل به سمت چپ می رویم.


    CMP    CX, 100

بررسی می کنیم که آیا CX به 100 رسیده یا خیر. ما مقدار اولیه اش را w + 100 قرار داده بودیم که به تدریج کم می شود.


    JAE    u1

اگر بزرگتر یا برابر با 100 بود به u1 پرش می کنیم تا پیکسل مجاور هم رنگ شود.


    MOV    AH, 00

زمانی که به تعداد w پیکسل رنگ شود به اینجا رسیده ایم. سرویس 0 از وقفه 16h را اجرا خواهیم کرد تا منتظر فشار دادن یک کلید شود. شماره سرویس در AH مشخص می شود.


    INT    16h

سرویس 16h را اجرا می کنیم. برنامه منتظر می ماند تا کاربر کلیدی را فشار دهد.


    MOV    AH, 00

در ادامه سرویس 00 از وقفه 10h را اجرا می کنیم تا مود گرافیکی را به حالت پیشفرض متنی برگردانیم. شماره سرویس در AH مشخص می شود.


    MOV    AL, 03

مود متنی پیشفرض 03 است که باید در AL مشخص شود.


    INT    10h

وقفه 10h را اجرا می کنیم تا از مود گرافیکی خارج شویم و مود متنی فعال شود.


    RET

برای بازگشت از توابع از دستور RET استفاده می شود.

نسخه ویرایش شده :

w    EQU 10
h    EQU 5

.MODEL  TINY
.CODE
.STARTUP
    MOV    AH, 0
    MOV    AL, 13h
    INT    10h
    MOV    CX, 100+w
    MOV    DX, 20
    MOV    AL, 15
u1:
    MOV    AH, 0ch
    INT    10h
    DEC    CX
    CMP    CX, 100
    JAE    u1
    MOV    AH, 00
    INT    16h
    MOV    AH, 00
    MOV    AL, 03
    INT    10h
    .EXIT    0
END

----------

