PDA

View Full Version : Interrupt 11 (Hardware Spec)



steward
یک شنبه 25 فروردین 1387, 00:55 صبح
سلام.
می خوام با استفاده از INT 11 مشخصات سخت افزاری و مدل اونها رو در یک جدول نشون بدم.ولی دقیقا نمی دونم از INT 11 چطور استفاده کنم.

اگه ممکنه راهنمایی کنید.ممنون

hoax3r
یک شنبه 25 فروردین 1387, 19:56 عصر
این وقفه وقتی استفاده میشه مشخصات رو وارد ثبات AX میکنه
خوب برای برسی این ثبات باید بیت های مورد نظر رو دونه دونه برسی کنیم
AX دو بایته یعنی 16 بیت، هر بیت مشخص کننده یه مشخصه هست

مثلا اگه بخایم بفهمیم که بیت اول برابر 1 هست یا نه این کار رو میکنیم


int 11h
and ax, 1h
cmp ax, 1

بعد با cmp برسی میکنیم اگه مقدار Ax برابر 1 بشه یعنی بیت اول AX هم برابر 1 بوده

برای بقیه هم همینکارو بکنین.

فقط این رو در نظر داشته باشید که من اینجا که نوشتم 1h منظورم 0000000000000001 هست در مبنای 2
اگه بخواین بیت 3 رو برسی کنید میشه 0000000000000100 (4 در مبنای 16)
یعنی سومین بیت رو برابر 1 قرار میدیم بعد با AX عمل AND رو انجام میدیم ببینیم این بیت برابر 1 هست یا نه

اگه اطلاعات بیشتر از بیتهایی که این وقفه به AX میفرسه می خواین اینجا رو ببینید:


http://barnamenevis.org/forum/showthread.php?t=90984


شاد باشید

steward
دوشنبه 26 فروردین 1387, 00:27 صبح
ممنون.زحمت کشیدید

steward
دوشنبه 26 فروردین 1387, 00:31 صبح
یه سوال دیگه این که وقتی کد اسمبلی رو می نویسم باید علاوه بر کد بالا چیز دیگری هم بنویسم؟

steward
دوشنبه 26 فروردین 1387, 00:32 صبح
یه سوال دیگه این که وقتی کد اسمبلی رو می نویسم باید علاوه بر کد بالا چیز دیگری هم بنویسم؟یا کد بالا کافیست؟

hoax3r
دوشنبه 26 فروردین 1387, 10:04 صبح
مثل اینکه درست منظورم رو نگفتم، اول عکسی که پایین ضمیمه کردم رو بینید

هر بیت AX یک مشخصه رو تعیین میکنه. مثالی که من زدم فقط بیت اول رو برسی میکنه
بیت اول برای فهمیدن نصب بودن دیسکت هست یعنی اگه بیت برابر 1 باشه دیسکت نصبه
و اگه 0 باشه یعنی نصب نیست، شما باید 16 بیت دیگه رو هم به همین صورت چک کنید.

فقط باید توجه کنید بعضی موقع ها باید دو بیت با هم چک بشن اگه عکسی که گزاشم رو ببیند
مثلا برای فهمیدن مود گرافیکی که بیت 4 و 5 هست. اولین کاری که میکنید 16 بیت صفر رو کنار هم بزارین
بعد موقعیت 4 و 5 (با فرض اینکه از 0 شروع بشه) تغییر بدین یعنی 0000000000110000 حالا من از همین
مبنای 2 استفاده میکنم که بهتر متوجه بشین اگه از دستور زیر مشابه دستور قبلی استفاده کنیم
طبق عکسی که بهتون دادم 4 حالت جواب برای بیت 4و 5 ممکنهه به وجود بیاد 00b یا 01b یا 10b یا 11b (منظور از b همون باینری هست)
باید برای این چهار حالت از دستور cmp استفاده کنید و طبق نتیجه مثلا اطلاعی که می خواین رو
تو خروجی چاپ کنید



int 11h
and ax, 0000000000110000b

cmp ax, 00b
je Mode1
cmp ax, 01b
je Mode2
cmp ax, 10b
je Mode3
cmp ax, 11b
je Mode4

...
...

Mode1:
...

Mode2:
...

Mode3:
...
Mode4:
...


اگه این برنامه رو قرار به عنوان تکلیف انجام بدین بهتره بیشتر روی تقسیمات حافظه مثل بیت و بایت و دستورات
بولی مثل AND مطالعه کنید.

steward
دوشنبه 26 فروردین 1387, 10:22 صبح
ممنون.منظورم این بود که وقتی از این وقفه استفاده می کنیم باید از وقفه دیگه هم استفاده کنیم تا روی صفحه چاپ کنیم.یا خودش چاپ می کنه؟

hoax3r
دوشنبه 26 فروردین 1387, 10:33 صبح
خودش چاپ نمیکنه باید از وقفه های دیگه استفاده کرد مثل وقفه 21h تابع 9

steward
دوشنبه 26 فروردین 1387, 10:41 صبح
یعنی در آخر که همه ی بیت هارو نوشتم و مقایسه کردم بعدش باید از int 21 استفاده کنم؟ معذرت انقدر سوال میکنم.چون من Developer نیستم.کارم شبکه است.و اگه بگم از assembly چیزی نمیدونم فکر کنم دروغ نگفتم.

hoax3r
دوشنبه 26 فروردین 1387, 11:17 صبح
این بستگی به شما داره که چطور برنامه رو می خوای پیاده کنی میتونی بعد مقایسه هر بیت
بخشی از جدول رو چاپ کنی یا آخر سر طبق مقایسه های انجام شده جدول رو به خروجی بدی

کار ما هم چیز دیگس ولی بر حسب علاقه با این زبان هم کار میکنم

steward
دوشنبه 26 فروردین 1387, 14:12 عصر
ممنون.وقت گذاشتین

steward
سه شنبه 27 فروردین 1387, 11:53 صبح
سلام.اگه من مشخصات سخت افزار رو بخوام از کدام Interrupt باید استفاده کنم؟ مشخصاتی مثل سازنده و مدل و ....
البته در مورد SMBIOS تا حدی می دونم؟ ولی اگه ممکنه بازم راهنمایی کنید؟

ممنون