الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

اظهار حرف علي الشاشة بأكثر من طريقة

مغلق
بدأه medo_elkorsan في 25 فبراير 2006 · 6 رد · 978 مشاهدة · في لغة Assembly لأنظمة 16, 32, 64 بت
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع
model small
.stack 100h

.data
hello_message db 'Hello, World!',0dh,0ah,'$'
.code
main  proc
     mov    ax,@data
     mov    ds,ax

     mov    ah,9
     mov    dx,offset hello_message  ;1
     int    21h
     mov    ah,0eh
     mov    al,'a'                   ;2 
     int    10h     
     mov    ax,4C00h
     int    21h
main  endp
end   main

ما هو الفق بين الطريقتين ؟

اعرف ان الطيقة الاولي تستخدم داالة في الدوس والثانية تستخدم المقاطعات..ولكن ما الفرق ؟

هل تعمل الطرقة الثانية بدون الحاجة لنظام التشغيل .ام ان المقاطاعات اصلا موجودة في نظام التشغيل؟

لا اله الا الله
#2

الاولى خاصة بطباعة او ارسال بمعنى اخر سلسلة محارف منتهية بالرمز $ الى الخرج. الثانية تقوم بطباعة حرف واحد فقط كما في حالة الالة الكاتبة لذلك تسمى teletype output

الاثنتين تستخدمان المقاطعات بغض النظر عن المقاطعة هل هي تابعة للدوز او للبيوس.

اقتباس
هل تعمل الطرقة الثانية بدون الحاجة لنظام التشغيل .ام ان المقاطاعات اصلا موجودة في نظام التشغيل؟

اين سيتم اظهار الخرج, على الشاشة عبر نظام DOS. المقاطعات موجودة مع نظام التشغيل كـ DOS او سلفا في البيوس وهي مقاطعات خاصة اخرى بالتهيئة وما شابه.

يمكنك الاطلاع على قائمة كاملة من هذا الموقع:

http://www.cs.cmu.edu/~ralf/files.html

الملفات مضغوطة في نفس الصفحة وهي كاملة مع الشرح الوافي.

اعتقد انا مررنا بهذه الصفحة مرات كثيرة.. يرجى الاطلاع اكثر على مواضيع القسم قبل طرح سؤال جديد.

تم تعديل هذه المشاركة بواسطة Xacker في 26 فبراير 2006 في 00:25

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#3
medo_elkorsan كتب:
هل تعمل الطرقة الثانية بدون الحاجة لنظام التشغيل

نعم، يمكنك و ضعها في Boot Sector وتنفيذها مثلا

d4baa0.gif
#4
DeltaAziz كتب:
نعم، يمكنك و ضعها في Boot Sector وتنفيذها مثلا

طبعا لانها من مقاطعات البيوس التي ستنفذ اولا قبل اعطاء التحكم لنظام التشغيل.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#5
.MODEL TINY
.DATA
hello db 'Hello,World'
.CODE
start:
mov bx,offset hello
mov cx,12
lop: mov ah,0eh 
mov al,[bx]                 
int 10h
inc bx
loop lop
int 21h                  
mov ah,4ch              
int 21h                 
END START                     
END

هذا البرنامج انا اللي كتبته!

المهم :

ناقص طريقة مش عارف اعملها ..هي طريقة عنونة ذاكرة الشاشة 0xb80000 ازاي اعملها؟

لا اله الا الله
#6

طريقة التعامل مع الذاكرة المباشرة لكارت الشاشة :

clrscr: 	 ; Clear Screen
	push	es	; save es in the stack
	push	0B800h
	pop	es	; es = 0B800h
	xor	di,di	; di = 0000h
	mov	ax,0720h	; ax = 0720h
cls:
	stosw  ; es:[di] = ax , di = di +2
	cmp	di,4000	; for all screen
	jne	cls
	pop	es	; restore es from stack
	mov	ah,02h	; int 10h,02h = set cursor position
	xor	bx,bx	; text screen
	xor	dx,dx	; x = 0 , y = 0
	int	10h	; set cursor position at (0,0)
	iret

دي كانت مقاطعة قمت بكتابتها لعمل وظيفة clrscr لمسح الشاشة , والطريقة تستخدم الذاكرة المباشرة لكارت الشاشة

لاحظ قيمة ax تحتوي القيمة 0720h يعني ah = 07h اي خلفية سوداء والكتابة رمادي (الشكل الاعتيادي للكتابة على الشاشة) , وقيمة al = 20h أي قيمة الاسكي للمسافة يعني 32 عشري

يبقى لكل حرف على الشاشة يحتاج الكتابة في 2 بايت الأول للألوان والثاني قيمة الأسكي الخاصة بالحرف المراد طباعته

طبعا في المثال احتاج اكتب نفس القيمة اللي هي مسافه في جميع مواضع الشاشة يعني 80 * 25 = 2000 حرف , كل حرف يستخدم 2 بايت يعني محتاج اكتب 4000 بايت , لهذا عملت تكرار 4000 مره كل مره تتغير بمقدار 2

بالتوفيق

#7

شكرا..

بس لسه مفهمتش!!

يمكن دي مرحلة متقدمة!!

لا اله الا الله

هذا الموضوع مغلق.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…