# برنامه نویسی سطح پایین > برنامه نویسی اسمبلی خانواده x86 >  روشن کردن چراغ های کیبورد با اسمبلی؟

## one hacker alone

با یاد خدا با سلام خدمت برادر های عزیز من یه قطعه کد میخوام که با زدن کلید شیفت (فرقی نداره کدومش) یکی از چراغ های کیبود یا نام لوک یا کپس لوک روشن بشه من در این مورد زیاد سرچ کردم هم منابع فارسی و هم انگلیسی اما هیچ کدوم از کد ها کار نکردند برای کار با کیبورد وقفه 16 استفاده میشه  کامپایل کردم و بر روی لپ تاپ با پردازنده اینتل اجرا کردم masmنمیدونم چرا کد ها کارنکردند من کد ها رو با برنامه 
بعضی از برنامه ها اجرا نمی شدند و بعضی هم خطای زیر رو نشان میدهند Invalid win32 application اگه کسی کدی داره که کار کنه ممنون میشم کمک کنید

----------


## tdkhakpur

از کامپایلر خط فرمان برای کاربران اسمبلی  برای کامپایل استفاده کنید.



> من یه قطعه کد میخوام که با زدن کلید شیفت (فرقی نداره کدومش) یکی از چراغ های کیبود یا نام لوک یا کپس لوک روشن بشه
> من در این مورد زیاد سرچ کردم هم منابع فارسی و هم انگلیسی اما هیچ کدوم از کد ها کار نکردند
> برای کار با کیبورد وقفه 16 استفاده میشه


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

----------


## vahid1

البته اين اطلاعات يك كم قديمي است ولي شايد كار شما را راحت تر كند.
صفحه‌ي كليد توسط 2 كنترلر يكي درون خود صفحه كليد و يكي برروي mother board كنترل مي‌شود. ارتباط اين دو كنترلر از طريق پورت‌هاي سخت‌افزاري 60H و 64H انجام مي‌شوند. اين دو پورت مكانيزم‌هاي لازم براي تبادل اطلاعات از صفحه كليد به كامپيوتر و برعكس را در اختيار مي‌گذارند. با مراجعه به IBM PC Reference guide مي‌تونيد روش برنامه نويسي اين پورت‌ها رو ياد بگيريد البته اين بحث‌ها در زمان‌هاي قديم (DOS) هم كار راحتي نبوده ، اين روزها در محيط ٌWindows كه اصلاً كار راحتي نيست.
علاوه بر اين پورت‌ها در آدرس‌هاي پائين حافظه‌ي RAM كه توسط BIOS و اينتراپت‌ها استفاده مي‌شود. بخش‌هايي وجود دارد كه يكي از آنها به بايت وضعيت صفحه كليد اختصاص داده شده . اين بايت در آدرس 0000:0417 است. با خواندن و نوشتن اين بايت مي‌تونيد وضعيت كليدها و چراغ‌هاي صفحه كليد را خوانده و تغيير دهيد. شرح بيت‌هاي اين بايت عبارت است از:
     7     6     5     4     3     2     1     0
     +-----+-----+-----+-----+-----+-----+-----+-----+
     | INS | CAP | NUM | SCR | ALT | CTL | LSH | RSH |
     +-----+-----+-----+-----+-----+-----+-----+-----+

     Bit 0: Right-Shift key depressed:  1 = YES, 0 = NO.
     Bit 1: Left-Shift key depressed:  1 = YES, 0 = NO.
     Bit 2: Ctrl key depressed:  1 = YES, 0 = NO.
     Bit 3: Alt key depressed:  1 = YES, 0 = NO.
     Bit 4: Scroll Lock active:  1 = YES, 0 = NO.
     Bit 5: Num Lock active:  1 = YES, 0 = NO.
     Bit 6: Caps Lock active:  1 = YES, 0 = NO.
     Bit 7: Insert mode:  1 = ACTIVATED, 0 = UNACTIVATED.

خوب با اين توضيحات مي‌تونيد حافظه را در اين آدرس بخونيد و با AND كردن اعداد دلخواه و باز نوشتن آن چراغ‌ها را به دلخواهتون روشن و خاموش كنيد. البته اين كار در Windows خيلي اما و اگر دارد.

و راه حل مطمئن براي windows: خوب هر چه سيستم‌عامل‌ها پيشرفته مي‌شوند اين جوركارها را بايد با اطلاع آن‌ها انجام داد. به عبارت ديگر اجازه‌ي خواندن و نوشتن روي پورت‌ها و آدرس‌هاي حافظه كار هر برنامه‌اي نخواهد بود پس سيستم‌عامل حداكثر امكانات مورد نياز را در قالب كتابخانه‌هاي استاندارد خود يا  API ارائه مي‌كند تا هم برنامه نويسان بتوانند كارهاي عادي و مجاز را به راحتي انجام دهند و هم سطوح امنيتي سيستم عامل حفظ شود. سيستم‌عامل Windows تابع keybd_event را به همين منظور تعبيه كرده با فراخواني اين تابع هم مي‌توانيد وضعيت كليدها را بخوانيد و هم وضعيت جديد را تعيين كنيد.

موفق باشيد

----------


## one hacker alone

با یاد خدا
دوستان ممنون از کمکتون فقط یه مشکلی که هست چون من در اسمبلی تازه کار هستم کار با وقفه ها رو خوب نمیدونم مثلا همین استفاده از and , or برای تغییر محتویات ثبات رو میدونم اما نمیدونم اول باید چی بنویسم و چجوری وقفه رو بهش بدم و با چه ثباتی کار کنم
اگه کسی بلده فقط یه نمونه خیلی کوچیک بزاره خودم بقیه رو انجام میدم
چجوری به ادرس  0000:0417
و چکار کنم؟

یا 
 اگه بخوام از تابع keybd_event استفاده کنیم چه کامپایلری استفاده کنم که بتونه این تابع رو بشناسه و در واقع تو کتابخانه توابع داشته باشه؟؟؟؟؟؟؟؟؟؟

----------


## xman_1365_x

> دوستان ممنون از کمکتون فقط یه مشکلی که هست چون من در اسمبلی تازه کار هستم کار با وقفه ها رو خوب نمیدونم مثلا همین استفاده از and , or برای تغییر محتویات ثبات رو میدونم اما نمیدونم اول باید چی بنویسم و چجوری وقفه رو بهش بدم و با چه ثباتی کار کنم


هنوز زوده اومدين اين تالار پله پله ، اول كار هاي ساده انجام بدين مثل محاسبات اعداد كوچك،تبديل عدد به اسكي و بلعكس اينارو با همون and ,or انجا بدي!
كمي هم با وقفه آشنا ميشي
در تاپيك هاي ديگه چيزي كه ميخواهيد هست!
چجوری به ادرس 0000:0417

اينو توي يك تاپيك جند دقيقه قبل جواب دادم توي صفحه اول بگردين پيداش مي كنيد



> اگه بخوام از تابع keybd_event استفاده کنیم چه کامپایلری استفاده کنم که بتونه این تابع رو بشناسه و در واقع تو کتابخانه توابع داشته باشه؟؟؟؟؟؟؟؟؟؟


بايد از اسمبلر هاي 32 بيتي استفاده كنيد(مثل masm32,ml,nasm) كه هنوز زودتونه چون بايد با دستورات اسمبلي 16 و 32 آشنا شيد بعد استفاده از توابع api در كنارش
توابع api هم مثل وقفه ها كار خاصي انجام ميدن كه شما درگير نوشتنش نشيد(البته دليل امنيتي هم داره)
اونارو در برنامه فراخواني ميكنيد و در صورت آشنايي با توابع اون فايل ازش استفاده مي كنيد!
مرجع api هم به msdn مراجعه كنيد.

----------


## one hacker alone

دوست عزیز میدونم که خیلی زوده برای این کار اما من  پروژه دارم و باید انجامش بدم  نمی خوام پول بدم کسی برام انجامش بده چون کار بی ارزرشی هست اما اینکه شما دوستان کمک کنید تا بتونم لا اقل به اون چیزی که میخوام نزدیک بشم خیلی بهتره

ممنون 

ظاهرا برای روشن کردن چراغ های کیبورد از وقفه 16h و پورت بایوس 60 استفاده  میشه که با تغییر بیت های محتوای ثبات al با دستورات AND و ORوضعیت چراغ  ها تغییر میکنه اما مشکل اینه که نمیدونم این کار دقیقا چجوری انجام میشه

----------


## tdkhakpur

> ظاهرا برای روشن کردن چراغ های کیبورد از وقفه 16h و پورت بایوس 60 استفاده میشه که با تغییر بیت های محتوای ثبات al با دستورات AND و ORوضعیت چراغ ها تغییر میکنه اما مشکل اینه که نمیدونم این کار دقیقا چجوری انجام میشه


میتونید محتوای فلاگ مخصوص این چراغها رو با تغییر در آدرس 40:0017H روشن و خاموش کنید.
البته کدوم بیت مخصوص کدوم چراغ هست دقیقا خاطرم نیست ولی بصورت زیر میتونید این تغییر رو اعمال کنید.

      mov dx, 40h
      mov es, dx
      mov bx, 17h
      mov dl, byte ptr es:[bx] // دریافت وضعیت کنونی

      or  dl, 64
      mov byte ptr es:[bx], dl // تغییر وضعیت چراغ

----------

