PDA

View Full Version : كمك در برنامه نويسي سيستم



reza_azizi2010
پنج شنبه 16 اردیبهشت 1389, 15:17 عصر
سلام
من اين ترم برنامه سازي سيستم دارم و استادمون داره اسمبلي ميگه
واسه پروژه چندتا موضوع گفته همشون خيلي سختن!
چندتاش ايناست، البته نگفته حتمن خودمون بنويسيم، ميگه مهم تر اينه كه بتونيد پروژه رو كامل بفهميد و بتونيد برام توضيح بديد حتي اگه پروژه مال خودتون نيست.
درضمنن مهم نيست با چه زباني مينويسيم البته زبانهاي ويژوال قبول نيست.

1-ارتباط كامپيوتر با بيرون توسط يكي از پورتها (موازي-سري-ps2) يا هر پورتي كه شد، بتونه مثلا يه متني رو به يه كامپيوتره ديگه بفرسته
2-از طريق يكي از پورتها بتونه به يك سون سگمنت اطلاعات بفرسته
3-يه برنامه رزيدنت كه يه كاري رو انجام بده، مثلا نذاره سي دي رام بيرون بياد يا نذاره به يكي از درايوها دسترسي داشته باشيم
4-يه قفل سخت افزاري كه به يكي از پورتها وصل بشه
5-يه ويروس كوچيك كه بتونه رزيدنت كار كنه و يه كاري هم انجام بده
6-يه فايل راه انداز واسه سيستم بنويسيم
اگه كسي از اساتيد لطف كنند و همچين چيزي واسم تهيه كنند يا راهنمايي كنند كه چيكار كنم خيلي ممنون ميشم. خيلي گيرم لطفا كمكم كنيد

Mehran.GH
جمعه 17 اردیبهشت 1389, 22:38 عصر
ما رو یاد دوران جوانی انداختی :لبخندساده:

این کد برای ارتباط سریال است و جزییات مختصر در کامنت کد آمده و توضیح بیشتر یادم نیست چون سال 74 این تکلیف را انجام شده !
اگر اشتباه نکنم مرجع اصلی یک کتاب بود چاپ IBM که معماری سیستمهای 186 و 286 توضیح داده بود .
این پروژها هیچ کدام سخت نیست و هر کدام ازکتابهای مرجعی که در همان درس برنامه سازي سيستم از طرف استاد معرفی می شود را نگاه کنی دستورات مورد نظرت را پیدا می کنی. برنامه های رزیدنت هم که یک اینتراپت را باید صدا کنی که اگر درست یادم باشد INT 27H این کار را انجام می دهد.



;
stack1 segment para stack 'stack'
db 256 dup(0)
stack1 ends
;
code segment para public 'code'
start proc far
;
;
assume cs:code
push ds
mov ax,0
push ax
;
;part 1 :initialize the 8250 uart for;
;8 bit data,1stop bit,no parity,1200 baud
;
mov dx,3fbh
mov al,80h
out dx,al
mov dx,3f8h
mov al,60h
out dx,al
mov dx,3f9h
mov al,0
out dx,al
;
;the baud rate has now been initilized
;now initilized the line control register
;
mov dx,3fbh
mov al,07h
out dx,al
;
;now initilized the modem control register for:
;request to send and data terminal ready signals
;and set the loopback feature
;
mov dx,3fch
mov al,13h
out dx,al
;
;now disabel all four classes of interrupt
;
mov dx,3f9h
mov al,0
out dx,al
;
;par 2 ;display what is received from the 8250
; transmit what is input from the keyboard
;
forever:mov dx,3fdh
in al,dx
test al,1eh
jnz error
test al,01h
jnz receive
test al,20h
;
jz forever
;
;if fall through to here then the 8250 is ready for another
;character to transmit
;
mov ah,1
int 16h
jz forever
;
;if fall through to here then there is keyboard
;character to transmit
;
mov ah,0
int 16h
;
;al has the keyboard character for transmition
;
mov dx,3f8h
out dx,al
jmp forever
;
;this point is reached if a character was received
;by the 8250 with no errors
;
receive:mov dx,3f8h
in al,dx
and al,7fh
;
push ax
;
;prepare to display the character
;
mov bx,0
mov ah,14
int 10h
pop ax
cmp al,0dh
jnz forever
;
;if it was a carriage return,then a line feed
;must also be displayd
;
mov al,0ah
mov bx,0
mov ah,14
int 10h
jmp forever
;
;if this point is reached then there was an error
;in the received character clear the receiver
;data register and display a ?
;
error: mov dx,3f8h
in al,dx
mov al,'?'
mov bx,0
mov ah,14
int 10h
jmp forever
;
start endp
code ends
end start

reza_azizi2010
یک شنبه 19 اردیبهشت 1389, 00:00 صبح
ما رو یاد دوران جوانی انداختی :لبخندساده:

این کد برای ارتباط سریال است و جزییات مختصر در کامنت کد آمده و توضیح بیشتر یادم نیست چون سال 74 این تکلیف را انجام شده !
اگر اشتباه نکنم مرجع اصلی یک کتاب بود چاپ IBM که معماری سیستمهای 186 و 286 توضیح داده بود .
این پروژها هیچ کدام سخت نیست و هر کدام ازکتابهای مرجعی که در همان درس برنامه سازي سيستم از طرف استاد معرفی می شود را نگاه کنی دستورات مورد نظرت را پیدا می کنی. برنامه های رزیدنت هم که یک اینتراپت را باید صدا کنی که اگر درست یادم باشد INT 27H این کار را انجام می دهد.



;
stack1 segment para stack 'stack'
db 256 dup(0)
stack1 ends
;
code segment para public 'code'
start proc far
;
;
assume cs:code
push ds
mov ax,0
push ax
;
;part 1 :initialize the 8250 uart for;
;8 bit data,1stop bit,no parity,1200 baud
;
mov dx,3fbh
mov al,80h
out dx,al
mov dx,3f8h
mov al,60h
out dx,al
mov dx,3f9h
mov al,0
out dx,al
;
;the baud rate has now been initilized
;now initilized the line control register
;
mov dx,3fbh
mov al,07h
out dx,al
;
;now initilized the modem control register for:
;request to send and data terminal ready signals
;and set the loopback feature
;
mov dx,3fch
mov al,13h
out dx,al
;
;now disabel all four classes of interrupt
;
mov dx,3f9h
mov al,0
out dx,al
;
;par 2 ;display what is received from the 8250
; transmit what is input from the keyboard
;
forever:mov dx,3fdh
in al,dx
test al,1eh
jnz error
test al,01h
jnz receive
test al,20h
;
jz forever
;
;if fall through to here then the 8250 is ready for another
;character to transmit
;
mov ah,1
int 16h
jz forever
;
;if fall through to here then there is keyboard
;character to transmit
;
mov ah,0
int 16h
;
;al has the keyboard character for transmition
;
mov dx,3f8h
out dx,al
jmp forever
;
;this point is reached if a character was received
;by the 8250 with no errors
;
receive:mov dx,3f8h
in al,dx
and al,7fh
;
push ax
;
;prepare to display the character
;
mov bx,0
mov ah,14
int 10h
pop ax
cmp al,0dh
jnz forever
;
;if it was a carriage return,then a line feed
;must also be displayd
;
mov al,0ah
mov bx,0
mov ah,14
int 10h
jmp forever
;
;if this point is reached then there was an error
;in the received character clear the receiver
;data register and display a ?
;
error: mov dx,3f8h
in al,dx
mov al,'?'
mov bx,0
mov ah,14
int 10h
jmp forever
;
start endp
code ends
end start



سلام دوست خوب
ممنون كه به سوالم جواب دادي
شما يه تيكه كد گذاشتين اما من اصلا ازش سر در نميارم!
اين برنامه چيزي به پورت ميفرسته؟
كد رو هم اجرا كردم اما چيزي نفهميدم
ميتونيد بيشتر توپيح بدين؟
يا اگه حضور ذهن دارين بگين منبع شما چي بود
با تشكر

Mehran.GH
یک شنبه 19 اردیبهشت 1389, 06:55 صبح
این کد ارتباط از طریق پورت سریال بین دو کامپیوتر است که کاراکتر تایپ شده در کامپیوتر اول در مانیتور کامپیوتر دوم قابل مشاهده است و در حقیقت همان پروژه اول است.

مرجع هم یک کتاب بود فکر کنم با نام 80X86 IBM PC and Compatible Computers

برای اینکه کد اسمبلی را متوجه شوی باید حتما شناخت مختصری از سخت افزار سیستم داشته باشی تا متوجه بشوی هر دستوری که به رجیسترها ارسال می کنی چه اتفاقی رخ می دهد .

برای ارتباط سریال یک چیپ 8250 استفاده می شد و به طور مثال اگر بخواهی با Com1 کار کنی آدرس پایه آن 3F8 است و تعداد دیگری رجیستر هم هست که مجبور به استفاده از آنها هستی اما مراحل کلی :

اول باید برای چیپ 8250 مشخصات ارتباطی را تعریف کنی

8 bit data
stop bit 1
no parity
1200 baud

که در Part1 کد این کار انجام شده .

در Part2
هر زمان که دیتایی از کامپیوتر دیگر دریافت شود یک بیت که Data Ready نامیده می شود و در رجیستر Line Status Register قرار دارد از صفر به یک تغییر می کند که در یک حلقه باید مرتب این بیت چک شود و هر زمان که اکتیو شد به رجیستر دیگری که دیتا در آن وارد شده با نام Receiver Buffer مراجعه کرد و دیتا را به استک انتقال موقت داد و بعد برای نمایش این کاراکتر بر روی مانیتور از وقفه 10 داس استفاده کرد.
در بخش برنامه نویسی اسمبلی فروم هم کتاب مرجع و یا لیست وقفه های داس و غیره .... را می توانی پیدا کنی همانند :

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

موفق باشید

reza_azizi2010
سه شنبه 21 اردیبهشت 1389, 00:57 صبح
سلام
اين چيپ 8250 رو از كجا بيارم
چطوري بهش برنامه بدم؟!
من يه سرچ زدم اين چيپ رو پيدا كردم چه شكليه اما نميفهم بايد چيطور باهاش كار كنم
ميشه بيشتر توضيح بدين

Mehran.GH
سه شنبه 21 اردیبهشت 1389, 22:23 عصر
8250 به منظور استفاده در کامپیوترهای اولیه IBM تولید شد و هدف از آن هم ارتباط سریال بود و نسلهای بعدی آن 8250B و 16450 و..... بوده است بنابراین این چیپ را نیازی ندارید از جایی تهیه کنید چون در کامپیوتری که کار می کنید یکی از نسلهای بعدی این چیپ قرار گرفته و تنها کاری که می کنید باید این چیپ را بشناسید و روش کار کردن با آن و رجیسترهای آن را آشنا باشید تا بتوانید کد بنویسید.

این لینکها در باره ارتباط سریال توضیح کافی داده اند:

http://www.lammertbies.nl/comm/info/serial-uart.html

http://www.beyondlogic.org/serial/serial.htm


عرض شود که
عناوین دوره برنامه سازي سيستم را در اینترنت نگاهی انداختم و به نظرم مطلب زیادی راجع به مفاهیم سخت افزاری گفته نشده بنابراین برای اینکه جهت حرکت را داشته باشی یک مثال را توضیح می دهم :

این سه خط کد را نگاه کن

mov dx,3fbh
mov al,80h
out dx,al

کاری که این سه خط انجام می دهد نهایتا این است که مقدار 80 هگز را به آدرس 3fb هگز می ریزد.

آدرس 3fb چه مفهومی دارد؟

این 3fb در حقیقت آدرس یک رجیستر است . در اسمبلی بیشتر باید با رجیسترها کار کرد اما بجز رجیسترهای پایه بقیه را با آدرس می شناسیم که در مراجع لیست کامل به همراه آدرس هگز آنها وجود دارد.

مثلا اینجا آدرس 3fb را می بینی اما نمی دانی آدرس چی است اگر به Table 5 مرجع دومی که معرفی کردم مراجعه کنید می بینید که یک رجیستر با نام Line Control Register دارای آدرس Base Address +3 = 3f8+3 یا همان 3fb است بنابراین مقدار 80 به رجیستر Line Control Register ریخته شده

حالا چرا 80 هگز ؟

با مراجعه به Table 10 همان مرجع متوجه می شوی که ارسال 80 هگز به این رجیستر یعنی اینکه بیت 7 آن یک شود و تاثیری که دارد این است اعلام میکند Boud Rate یا سرعت ارتباط سریال در مرحله بعد باید تعریف شود .

Baud Rate چگونه تعریف می شود ؟!!

روش تعریف سرعت ارتباط سریال بین دو وسیله به این صورت است که یک سرعت مرجع 115200 باید تقسیم بر یک ضریبی بشود تا سرعت مورد نظرت را داشته باشی بنابراین باید با مراجعه به Table 6 ببینی مثلا اگر بخواهی با سرعت 19200 ارتباط سریالت باشه آن سرعت مرجع 115200 را باید بر چی تقسیم کنی که در مورد مثال 19200 باید بر 6 تقسیم شود و مفهوم عملی آن این است که در دو رجیستر Divisor Latch Low Byte مقدار 06h و در Divisor Latch High Byte مقدار 00h بریزی.

این همه کار انجام دادیم تا فقط سرعت ارتباط سریال را تعریف کنیم , زبان اسمبلی است دیگه!

دقت کن که کل برنامه یک ساختار کلی دارد که ابتدا آماده سازی سیستم و تعاریف اولیه است و بعد اجرا حلقه ای که متوجه می شود که دیتا وارد شده و نهایتا نمایش بر روی مانیتور , این ساختار را در ذهن داشته باش و کد را برای خودت توضیح بده که چه روندی باید طی شود تا این ساختار تحقق یابد.

موفق باشید

reza_azizi2010
پنج شنبه 23 اردیبهشت 1389, 08:47 صبح
سلام
توضيحاتتون كامل و فوق العاده بود
اما فكر ميكنم اين پروژه كار زياد ميبره (شايدم من بر موضوع تسلط ندارم)
يه موضوع ديگه هم استادمون گفته كه بايد بتونيم يه قفل سخت افزاري درست كنيم، مثلا با يكي از پورتها
بنظر شما اين موضوع راحتر نيست؟

Mehran.GH
جمعه 24 اردیبهشت 1389, 04:24 صبح
قفل سخت افزاری هم می تواند ساده باشد و هم نباشد!
اگر تعداد محدودی دیتا بخواهی از مثلا پورت موازی بخوانی و با متغیرهای ثابتی مطابقت بدهی که ساده است اما قفل سخت افزاری می تواند داستان پیچیده تری هم داشته باشد همانند روشی که یک بخش از برنامه اصلی در حافظه قفل ذخیره می شود و در ابتدای اجرا , این بخش برنامه از قفل خوانده می شود و یا روش دومی که الگوریتم خاصی بر مبنای شماره سریال CPU و .... باید اجرا شود و با مقادیری درون قفل مطابقت داده شود و از این کارهای فانتزی که پیاده سازی آن در اسمبلی ماجراجویی است!

به هر حال خواندن یک بایت از پورت موازی باید یک چیزی شبیه این کد باشد:



dosseg
.model small
.stack 100h

.code
main proc

mov dx,378h
in al,dx

mov ax,4C00h
int 21h
main endp
end main

reza_azizi2010
دوشنبه 03 خرداد 1389, 14:37 عصر
سلام
من هركاري ميكنم ميبينم نميشه!
ميشه آموزش يه قفل سخت افزاري خيلي ساده با پورت موازي رو بذاريد

Mehran.GH
چهارشنبه 05 خرداد 1389, 17:25 عصر
سلام
من هركاري ميكنم ميبينم نميشه!
ميشه آموزش يه قفل سخت افزاري خيلي ساده با پورت موازي رو بذاريد


ببین دوست جوان و کم حوصله من :لبخندساده:

این مثال قفل سخت افزاری در مقایسه با پروژه های واقعی که ممکن است بعدها انجام دهید در حد یک تمرین بسیار ساده است به خصوص اینکه 70 درصد کد همان است که در کامنت قبلی نوشتم حالا اگر متوجه کد نمی شوید و نمی توانید آن را برای کار خود تکمیل کنید باید یک مرحله به عقب برگردید و دستورات اسمبلی را بخوانید.

یک راهنمایی دیگر هم اینکه در این قسمت کد
mov dx,378h
in al,dx

یک بایت دیتا از پورت موازی خوانده می شود و در رجیستر al ذخیره می شود.

فقط یک خط کد لازم است که رجیستر al را با یک مقداری مقایسه کند و اگر نتیجه مقایسه صفر بود بپرد به جایی!