PDA

View Full Version : با فشردن یک دکمه برنامه ای اجرا شود



esibarnamenevis
پنج شنبه 16 آذر 1391, 10:24 صبح
سلام
زیر برنامه ای نوشتم و می خوام اونو مقیم در حافظه کنم (تا اینجا مشکلی نیست) و در هر برنامه با فشردن یک دکمه از کیبورد(مثلا F1) این برنامه اجرا شود.
دوستان هر کی میتونه کمکم کنه ممنون میشم
باتشکر

Delphi Coder
شنبه 18 آذر 1391, 22:40 عصر
برنامه چی هست و چیکار باید بکنه دقیقا؟ تحت داس یا ویندوز؟

esibarnamenevis
یک شنبه 19 آذر 1391, 11:18 صبح
برنامه چی هست و چیکار باید بکنه دقیقا؟ تحت داس یا ویندوز؟
سلام
برنامه ماشین حساب هست(شبیه ماشین حساب سمت راست کیبورد) و تحت داس( با مسم نوشته شده )
حالا چند تا سوال:
1- چطور باید مقیم در حافظه بشه(که بتونیم تو هر برنامه دیگه دسترسی داشته باشیم مثل وقفه ها که با روشن شدن سیستم در حافظه مقیم میشن)؟
2-حالا به فرض اینکه مقیم کردیم ، باید داخل هر برنامه ای با زدن دکمه F1 برنامه (ماشین حسابی که مقیم کردیم) اجرا شود؟

با تشکر

xman_1365_x
یک شنبه 19 آذر 1391, 16:14 عصر
برنامه های TSR رو مطالعه کنید،مشکلی بود سوال کنید.
http://cs.smith.edu/~thiebaut/ArtOfAssembly/artofasm.html
ضمنا کتاب سید رضی و فیض الله خاکپور هم در این ارتباط بخش هایی داره که مشکلتون حل شه
موفق باشید

esibarnamenevis
دوشنبه 20 آذر 1391, 16:08 عصر
برنامه های TSR رو مطالعه کنید،مشکلی بود سوال کنید.
http://cs.smith.edu/~thiebaut/ArtOfAssembly/artofasm.html
ضمنا کتاب سید رضی و فیض الله خاکپور هم در این ارتباط بخش هایی داره که مشکلتون حل شه
موفق باشید
با تشکر از جوابتون
لطف کنید بگید که چطوری با کلید f1 برنامه رو اجرا کنیم؟

Delphi Coder
چهارشنبه 22 آذر 1391, 00:47 صبح
سر و کله زدن با پورتهای I/O کیبورد حداقل برای من یکی زیاد راحت و خوشایند نیست.
من پیشنهاد میکنم یه فایل com برای این برنامه بنویسید و به جای F1 از کلیدهای ترکیبی مثلا 2 تا Shift با Alt استفاده کنید چون نیازی به کار با پورتهای I/O نداره.(تو آدرس 0040:0017) وضعیتش هست و میشه راحت چک کرد. رزیدنت کردن برنامه هم که کاری نداره. از وقفه 27 برای این کار استفاده کنید. و وقفه 09 یعنی وقفه کیبورد رو برای این کار hook کنید.

xman_1365_x
شنبه 25 آذر 1391, 11:17 صبح
لطف کنید بگید که چطوری با کلید f1 برنامه رو اجرا کنیم؟
باید از وقفه 16 استفاده کنید و بافر صفحه کلید رو چک کنید اگر اسکن کد اون برابر با 3B=F1 بود آنگاه برنامه شما اجرا بشه
موفق باشی

Delphi Coder
شنبه 25 آذر 1391, 23:39 عصر
باید از وقفه 16 استفاده کنید و بافر صفحه کلید رو چک کنید اگر اسکن کد اون برابر با 3B=F1 بود آنگاه برنامه شما اجرا بشه
موفق باشی
اتفاقا این تاپیک به خاطر جذابیتی که برام داشت من یه برنامه ساده و کوچک نوشتم برای تست. این روشی که شما گفتی رو تست کردم به یک دلیل که نتونستم متوجه بشم درست کار نمیکنه. این کدی هست که من نوشتم:

.286
cds segment
assume cs:cds
org 100h

begin:
jmp Main

OldHandlerOfs dw 0
OldHANDLERSeg dw 0
BusyFlag db 0

MyHandler proc near
pushf
call dword ptr cs:[offset OldHandlerOfs]
pusha
push ds
push es
mov ah,01h
int 16h
cmp ax,3b00h
jnz cnt
xor ax,ax
int 16h
mov al,byte ptr cs:[Offset BusyFlag]
or al,al
jnz cnt
mov byte ptr cs:[Offset BusyFlag],1
push cs
pop ds
push cs
pop es
call Beep
mov byte ptr ds:[Offset BusyFlag],0
cnt:
pop es
pop ds
popa
iret
MyHandler endp

Beep proc near
mov ax,0e07h
int 10h
ret
Beep endp

Main proc near
mov ax,3509h ; AH=35h Read Interrupt Vector AL=09h Keyboard Interrupt
int 21h
mov OldHandlerOfs,bx ; Save Address
mov OldHandlerSeg,es

mov ax,2509h ; AH=25h Write Interrupt Vector AL=09h Keyboard Interrupt
mov dx,offset MyHandler
int 21h
mov dx,offset Main
int 27h
Main endp
cds ends
end begin
این برنامه با فشار F1 یه بیپ ایجاد میکنه. همونطوری که میبینید در صورتی که F1 فشار داده شده باشه مقدارش رو هم از بافر بر میدارم در ضمن یه busyflag هم گذاشتم که دو بار وارد قسمتی که بیپ تولید میکنه نشه.
باگ برنامه زمانی به چشم میاد که F1 رو فشار بدیم و به مدت چند ثانیه نگه داریم. خواهیم دید که موقع تایپ هم بیپ میزنه.

esibarnamenevis
دوشنبه 27 آذر 1391, 00:26 صبح
سلام
با سپاس
نمونه برنامه رو با emu8086 اجرا کردم ولی نمیدونم چرا خطا میده(از وقفه 27) ؟؟ با masm بازم خطا داره(ولی منطقا برنامه درسته)؟؟؟
شما برنامه رو با اجرا کردید؟؟

esibarnamenevis
دوشنبه 27 آذر 1391, 00:38 صبح
یه سوال دیگه ؟
مگه برنامه ای که مقیم هستش تا زمانی که سیستم روشن هست داخل حافظه می مونه(درسته؟! ) و اگه چندین بار از محیط dos خارج شدیم و دوباره امدیم داخل محیط داس باید دسترسی داشته باشیم چون برنامه داخل رم هست(مگه نه؟!) پس باید هر موقع که خواستیم بتونیم برنامه ای که مقیم کردیم رو اجرا کنیم و دسترسی به اون برنامه داشته باشیم

1-حالا سوال بنده اینه که چطوری باید داخل محیط داس نه لزوما دقیقا بعد از اجرای برنامه بلکه مثلا برنامه را برای بار اول اجرا کردیم و بعد از محیط داس خارج شدیم و دوباره وارد داس شدیم اگه دکمه f1 رو زدیم برنامه واسمون اجرا بشه (نمیدونم منظورم رو کامل رسوندم یا نه!!)؟

2-سوال بعدی برنامه ام بدون خطا است(واسه مقیم سازی در حافظه) ولی توی برنامه های داخل حافظه مشخص نیست دلیلش چیه(وقتی دستور mem /pیا mem /c رو میزنم نام برنامه ام داخل برنامه ها در حافظه نیست)؟؟؟

در صورت امکان سوالات رو جدا جدا جواب بدین ممنون میشم

یاحق

Delphi Coder
سه شنبه 28 آذر 1391, 11:12 صبح
سلام
با سپاس
نمونه برنامه رو با emu8086 اجرا کردم ولی نمیدونم چرا خطا میده(از وقفه 27) ؟؟ با masm بازم خطا داره(ولی منطقا برنامه درسته)؟؟؟
شما برنامه رو با اجرا کردید؟؟
EMU8086 از اسمش ظاهرا باید شبیه ساز 8086 باشه ولی اطلاعاتی ازش ندارم و باهاش کار نکردم تا حالا. MASM هم ندارم با TASM 3.2 اسمبلش کردم. فکر کنم masm یکم سخت گیر تر از tasm بود تو گرامر علت اصلی هم که اون زمان tasm رو انتخاب کرده بودم همین بود.
بله برنامه درسته. اجرا هم میشه. منتها مشکل داره. حالا مشکل به خاطر این هست که در dos شبیه سازی شده ویندوز اجرا میشه یا نه مطمئن نیستم. TASM رو به همراه سورس ضمیمه کردم میتونید دانلود کنید و دقیقتر تست کنید خودتون.

Delphi Coder
سه شنبه 28 آذر 1391, 11:32 صبح
یه سوال دیگه ؟
مگه برنامه ای که مقیم هستش تا زمانی که سیستم روشن هست داخل حافظه می مونه(درسته؟! ) و اگه چندین بار از محیط dos خارج شدیم و دوباره امدیم داخل محیط داس باید دسترسی داشته باشیم چون برنامه داخل رم هست(مگه نه؟!) پس باید هر موقع که خواستیم بتونیم برنامه ای که مقیم کردیم رو اجرا کنیم و دسترسی به اون برنامه داشته باشیم بله زمان DOS اینطوری بود تا زمانی که سیستم روشن بود یا RESET نمیشد برنامه تو حافظه مقیم بود. اما الان که DOS شده یه برنامه کوچیک تو ویندوز که صرفا اون محیط رو شبیه سازی میکنه قضیه اونطور نیست شما وقتی یه cmd اجرا میکنید انگار یه pc خام میاد بالا و هیچی توش نیست جز یه سیستم عامل DOS. وقتی هم از اون خارج میشید کل سیستم جمع و جور میشه و برنامه رزیدنت شما هم به فراموشی سپرده میشه.


1-حالا سوال بنده اینه که چطوری باید داخل محیط داس نه لزوما دقیقا بعد از اجرای برنامه بلکه مثلا برنامه را برای بار اول اجرا کردیم و بعد از محیط داس خارج شدیم و دوباره وارد داس شدیم اگه دکمه f1 رو زدیم برنامه واسمون اجرا بشه (نمیدونم منظورم رو کامل رسوندم یا نه!!)؟شما از محیط DOS خارج نمیشید چون برنامه رزیدنت توی DOS معنی میده. توجه داشته باشید که DOS یه سیستم عامله و این حرفتون به این میمونه که بخواید یه برنامه در ویندوز اجرا کنید بعد سیستم رو restart کنید و انتظار داشته باشید برنامه تو حافظه و در حالت run بمونه در حالی که سیستم عامل خودش restart شده. در ضمن DOS مثل ویندوز MultiTask نیست SingleTask هست. یعنی هر برنامه ای که اجرا میشه کل کنترل سیستم رو در دست میگیره و هر برنامه ای بخواد (مثلا) همزمان با برنامه های دیگه کار کنه مجبور هست از طریق hook کردن وقفه ها این کار رو انجام بده. و توابعی که برنامه رو رزیدنت میکنند صرفا باعث پایان برنامه میشن بدون اینکه حافظه مربوط به برنامه رو آزاد کنند.


2-سوال بعدی برنامه ام بدون خطا است(واسه مقیم سازی در حافظه) ولی توی برنامه های داخل حافظه مشخص نیست دلیلش چیه(وقتی دستور mem /pیا mem /c رو میزنم نام برنامه ام داخل برنامه ها در حافظه نیست)؟؟؟

در صورت امکان سوالات رو جدا جدا جواب بدین ممنون میشم

یاحق
اگر در همون پنجره ای که برنامه شما رزیدنت شده بزنید اصولا باید نشون بده. ولی پنجره های دیگه مثل یه PC دیگه میمونند و نباید هم در اونها مشخص باشه.

esibarnamenevis
سه شنبه 28 آذر 1391, 14:05 عصر
EMU8086
حالا مشکل به خاطر این هست که در dos شبیه سازی شده ویندوز اجرا میشه یا نه مطمئن نیستم.

ماشاالله که سایت برنامه نویس از اساتیدی مثل شما کم نداره :تشویق:
دقیقا با این حرفتون موافقم خودم هم این نکته به ذهنم خطور کرده بود
واسه اجرا تو محیط سیستم عامل dos اصلی باید چکار کنم(بهترین را چیه؟)

Delphi Coder
سه شنبه 28 آذر 1391, 17:23 عصر
واسه اجرا تو محیط سیستم عامل dos اصلی باید چکار کنم(بهترین را چیه؟) سیستم عامل DOS کاملا از رده خارج شده زمان ویندوز 98 خود ویندوز 1 گزینه داشت که میرفت تو داس بعدها که XP اومد موقع فرمت فلاپی یه گزینه داشت که bootable می کرد فلاپی رو اما الا فکر میکنم اکثر PC ها اصلا فلاپی هم نداشته باشند. الان احتمالا راحتترین راه VirtualBox باشه. به هر حال شاید دردسرش کم هم نباشه اول باید مطمئن بشید که لازم هست یا میخواید این کار رو انجام بدید بعد شروع کنید.