PDA

View Full Version : ارتباط زبان برنامه نویسی با IO ها چگونه است ؟؟؟



seyed saeed
چهارشنبه 03 مهر 1398, 14:31 عصر
سلام
سوالی که می خواهم بپرسم شاید به نظر ساده باشه نمی دونم
ولی من این رو نمی دونم که وقتی مثلا می نویسیم printf دقیقا چه اتفاقی می افته تا نمایش داده بشه
کلا ارتباط به محیط های IO مثل کی بورد چه طور اتفاق می افته
مثلا می خواهیم یه کلید از کی بورد رو بخونیم
منظورم این که از کدوم تابع استفاده کنیم نیست بلکه اون تابع چه طور این ارتباط رو با سخت افزار برقرار می کنه
مثلا فرض کنید که تایع getchar نبود و قرار بود خودمون بنویسیم باید چیکار می کردیم ؟؟؟؟؟؟

farhad_shiri_ex
چهارشنبه 03 مهر 1398, 15:49 عصر
ولی من این رو نمی دونم که وقتی مثلا می نویسیم printf دقیقا چه اتفاقی می افته تا نمایش داده بشه
کلا ارتباط به محیط های IO مثل کی بورد چه طور اتفاق می افته

اگر بخواهم خیلی کلی بگم! کلیه عملیاتهای I/O در پردازشگر توسط دستور INT که دستوری است جهت اجرای وقفه های BIOS اجرا میشوند پس بنابراین وقتی میخواهیم به CPU اعلام کنیم میخواهیم محتوای آدرسی از حافظه را در یک خروجی معتبر نمایش بده(مثلا مانیتور) از وقفه int 21 استفاده میکنیم! همینطور الی آخر...
البته استفاده از وقفه ها بیشتر در پردازشگر های نسل 8086و80286و80386 مرسوم بود، در اسمبلرهای امروزی مانند nasm که 64 بیتی هستند شما دیگه درگیر نوشتن وقفه ها نمیشید و از توابع سطح پایین C را به راحتی call میکنیم بنابراین هم سرعت خیلی بهتر شده وهم برنامه نویسی با اسمبلی خیلی امن تر شده! البته این کاری هست که کامپایلر های قدرتمند امروزی مثل gcc هم انجام میدن یعنی لینکرها میان این لایبرری ها را به کد های شما لینک میکنند.
به هرحال توصیف عملکردهای سطح پایین توی 2 الی 3 خط امکانپذیر نیست!




مثلا می خواهیم یه کلید از کی بورد رو بخونیم
منظورم این که از کدوم تابع استفاده کنیم نیست بلکه اون تابع چه طور این ارتباط رو با سخت افزار برقرار می کنه
مثلا فرض کنید که تایع getchar نبود و قرار بود خودمون بنویسیم باید چیکار می کردیم ؟؟؟؟؟؟

بستگی داره اگر نخواهید از getchar استفاده کنید یعنی باید از اسمبلی استفاده کنید بنابراین حالا باید انتخاب کنید که از چه اسمبلری میخواهید استفاده کنید تحت ویندوز ویا xbase و اینکه برای چه ABI می خواهید کد اسمبلی بنویسید بعد از انتخاب اگر باز نخواهید وابستگی به library های c داشته باشید باید خودتون از وقفه ها استفاده کنید دقیقا مثل کد زیر که getchar هست برای پردازشگر های 16 بیتی ...

Getchr:
push bx
push cx
push dx
mov ah, 01h
int 21h
pop dx
pop cx
pop bx
ret

seyed saeed
شنبه 06 مهر 1398, 10:23 صبح
اگر بخواهم خیلی کلی بگم! کلیه عملیاتهای I/O در پردازشگر توسط دستور INT که دستوری است جهت اجرای وقفه های BIOS اجرا میشوند پس بنابراین وقتی میخواهیم به CPU اعلام کنیم میخواهیم محتوای آدرسی از حافظه را در یک خروجی معتبر نمایش بده(مثلا مانیتور) از وقفه int 21 استفاده میکنیم! همینطور الی آخر...
البته استفاده از وقفه ها بیشتر در پردازشگر های نسل 8086و80286و80386 مرسوم بود، در اسمبلرهای امروزی مانند nasm که 64 بیتی هستند شما دیگه درگیر نوشتن وقفه ها نمیشید و از توابع سطح پایین C را به راحتی call میکنیم بنابراین هم سرعت خیلی بهتر شده وهم برنامه نویسی با اسمبلی خیلی امن تر شده! البته این کاری هست که کامپایلر های قدرتمند امروزی مثل gcc هم انجام میدن یعنی لینکرها میان این لایبرری ها را به کد های شما لینک میکنند.
به هرحال توصیف عملکردهای سطح پایین توی 2 الی 3 خط امکانپذیر نیست!


بستگی داره اگر نخواهید از getchar استفاده کنید یعنی باید از اسمبلی استفاده کنید بنابراین حالا باید انتخاب کنید که از چه اسمبلری میخواهید استفاده کنید تحت ویندوز ویا xbase و اینکه برای چه ABI می خواهید کد اسمبلی بنویسید بعد از انتخاب اگر باز نخواهید وابستگی به library های c داشته باشید باید خودتون از وقفه ها استفاده کنید دقیقا مثل کد زیر که getchar هست برای پردازشگر های 16 بیتی ...

Getchr:
push bx
push cx
push dx
mov ah, 01h
int 21h
pop dx
pop cx
pop bx
ret

خیلی ممنون از توضیحاتتون نمی خواهم درگیر این برنامه نویسی بشم فقط سوال هست برام
مثلا الان ما از تابع getchar استفاده می کنیم داخلش ممکنه کدهایی باشه که شما نوشتید یا به روش دیگه ای ممکنه ارتباط با کی بورد رو برقرار کنه؟؟؟
بنده چون با میکروکنترلر سروکار دارم اون جا همیشه ما می تونیم سخت افزارمورد نظرمون رو صدا کنیم بگیم فلان خروجی رو ببین چیه مقدارش
ولی این جا این در کامپیوتر این لایه دیگه توسط برنامه نویس دیده نمیشه فقط کنجکاو بودم ببینم چه طور ارتباط برقرار میشه
تو میکروکنترلر ها معمولا به ازای هر خروجی و ورودی آدرس جداگانه ای هست که می تونیم بهشون دسترسی داشته باشیم

farhad_shiri_ex
شنبه 06 مهر 1398, 12:03 عصر
خیلی ممنون از توضیحاتتون نمی خواهم درگیر این برنامه نویسی بشم فقط سوال هست برام
بنده چون با میکروکنترلر سروکار دارم اون جا همیشه ما می تونیم سخت افزارمورد نظرمون رو صدا کنیم بگیم فلان خروجی رو ببین چیه مقدارش
ولی این جا این در کامپیوتر این لایه دیگه توسط برنامه نویس دیده نمیشه فقط کنجکاو بودم ببینم چه طور ارتباط برقرار میشه
تو میکروکنترلر ها معمولا به ازای هر خروجی و ورودی آدرس جداگانه ای هست که می تونیم بهشون دسترسی داشته باشیم

در تکمیل صحبت های شما بله! معماری کامپیوتر با معماری ARM , Micro Controller خیلی متفاوت هست! شما در میکرو ویا ARM با یکسری کامپوننت های الکترونیکی و پردازش گرهای مخصوص به همین معماری ها سرکار دارید با الطبع با آدرس دهی باس و پردازشگر و حافظه کش و... که در معماری کامپیوتر کاربرد دارند کاری ندارید!
ولی در کامپیوتر فشردن یک کلید در کیبرد کلی از قوانین و الگوریتم ها را باید طی کنه تا به لایه های بالاتر برسه و رویداد مناسب کلید را کاربر دریافت کنه!




مثلا الان ما از تابع getchar استفاده می کنیم داخلش ممکنه کدهایی باشه که شما نوشتید یا به روش دیگه ای ممکنه ارتباط با کی بورد رو برقرار کنه؟؟؟

بله! ولی روش ارتباط با کیبرد ربطی به این کدی که گذاشتم نداره! اون عملکرد توسط بایوس کنترل میشه !

pe32_64
شنبه 06 مهر 1398, 14:06 عصر
سلام
سوالی که می خواهم بپرسم شاید به نظر ساده باشه نمی دونم
ولی من این رو نمی دونم که وقتی مثلا می نویسیم printf دقیقا چه اتفاقی می افته تا نمایش داده بشه
کلا ارتباط به محیط های IO مثل کی بورد چه طور اتفاق می افته
مثلا می خواهیم یه کلید از کی بورد رو بخونیم
منظورم این که از کدوم تابع استفاده کنیم نیست بلکه اون تابع چه طور این ارتباط رو با سخت افزار برقرار می کنه
مثلا فرض کنید که تایع getchar نبود و قرار بود خودمون بنویسیم باید چیکار می کردیم ؟؟؟؟؟؟
این توابع که نام بردید ، توابع کتابخانه ای زبان c هستند.که پیاده سازیشون توسط توابع api سیستم عامل انجام میشه. سیستم عاملی که برنامه روش قراره اجرا بشه .

MAHDI.D.H.F
چهارشنبه 10 مهر 1398, 15:15 عصر
میشه راهنمایی کنید چطور باید مستقیما api هارو فراخوانی کرد؟

farhad_shiri_ex
پنج شنبه 11 مهر 1398, 10:37 صبح
میشه راهنمایی کنید چطور باید مستقیما api هارو فراخوانی کرد؟



در صورت تمایل سوال هاتون را در این سایت مطرح کنید! http://www.iostream.ir

pe32_64
دوشنبه 15 مهر 1398, 14:00 عصر
میشه راهنمایی کنید چطور باید مستقیما api هارو فراخوانی کرد؟
درسایت مایکروسافت مثال و توضیحات مورد نیازتون وجود داره.