PDA

View Full Version : تغییر رنگ



sahar2190
پنج شنبه 17 دی 1383, 22:12 عصر
mikham range ye reshtaro karakter be karakter taghieer bedam bayad az che vaghfhaie estefade konam mishe rahnemaie konid :)

man_56
یک شنبه 20 دی 1383, 12:30 عصر
BIOS INT 10h is the Video interrupt
AH=0Bh
BH=0 -> BL=forground color
BH=1 -> BL=palette 0 or 1

mortezamsp
دوشنبه 12 بهمن 1388, 00:33 صبح
ببخشی آقایی که خیلی بلدید ، چطور تو هرمرحله یه واحد به c اظافه کنیم ؟ c نه mov رو قبول میکنه نه inc نه add ! مشکل از برنامه منه ؟

$ M 3 H R D A D $
دوشنبه 12 بهمن 1388, 20:34 عصر
سلام به همه دوستای گلم

تیکه به تیکه کد و مینویسم بعدش توضیحاتشو.



.MODEL SMALL

.STACK 64

.DATA
;-----------------DaTa--------------

STR DB "MEHRDAD HOSSEINZADEH$"

R DB 00001000B

;-----------------------------------
متغیر STR رشته مورد نظر که هر چند کاراکتر که میخواین میتونه باشه

من منطق و این فرض کردم که زمینه کاراکتر همیشه سیاه باشه و رنگ کاراکتر عوض بشه

رنگ اولیه: بدون چشمک+زمینه مشکی+با شفافیت+متن مشکی در نظر گرفتم
و این رنگ و تو متغییر یک بایتی R گذاشتم



.CODE

MAIN PROC FAR
MOV AX,@DATA
MOV DS,AX
MOV ES,AX
;----------


MOV SI,0

FOR:

CMP STR[SI],'$'
JE EXIT
SI ایندکس آرایه ما است که مقدار صفر داره و با اون میخوایم رو رشتم مورد نظر حرکت کنیم و تک تکش و مورد پردازش قرار بدیم

اگه کاراکتری که SI به اون اشاره میکنه $ بود که میره به لیبل EXIT که همون منتظر موندن برای دریافت کاراکتر و دیدن نتیجه برنامه هست میره
اگه نبود....

من اومدم از سرویس 09 هگز اینتراپت 10 استفاده کردم که تعداد میگیره و یک اسکی کد یا همون کاراکتر و به تعدادی که دادیم کاراکتر را با رنگی که تو BL میریزیم چاپ میکنه اما مکان نما و خودش یکدونه جلو نمیبره یعنی اگه ما بگیم a را دوبار چاپ کن چاپ میکنه اما کرسر رو همون موقعیتی که کاراکتر دوم داره ایست میکنه

که اینجوری ما برنامه و اگه اجرا کنیم رنگارنگ چاپ میشه اما رو هم دیگه چاپ میشه

برای همین ما موقعیت فعلی مان نما و میخونیم با سروسی03 هگز اینترپت 10 و بعدش چون شماره ستون و میریزه توDL
ما چون میخوایم کاراکتر چاپ بشه بعدی جلوش چاپ بشه باید ستون و یکی جلو ببریم

و بعد به شماره سطر و ستونی که به دست آوردیم با سرویس 06 هگز انتقال مکان نما انجام بدیم و بعد....



;-----ELSE------

MOV AH,03H
MOV BH,00H
INT 10H

INC DL

MOV AH,02H
MOV BH,0
INT 10H

این دستوره زیری میگه که کاراکتری که SI به اون اشاره داره و یک بار چاپ کن اما قبلش R و که توش رنگ متن و زمینه هست و یکی اضافه کن که رنگش مثل قبلیه نشه

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

واسه همین با دستور



ADD R,1
AND R,00001111B
اول رنگ و تغییر دادم بعد رنگ و با عددی که بالاست ADD کردم که همیشه رنگ زمینه مشکی باشه

و در نهایت کاراکتر چاپ میشه و SI یدونه اضافه میشه تا به کاراکتر بعدی اشاره کنه و بعد میپره و سیکل ادامه داره

در نتیجه تکه بعدی برنامه میشه




MOV AH,09H
MOV CX,1
MOV BH,0
MOV AL,STR[SI]

ADD R,1
AND R,00001111B
MOV BL,R

INT 10H
INC SI

JMP FOR


EXIT:
;-----------
MOV AH,00H
INT 16H

MOV AX,4C00H
INT 21H
MAIN ENDP
END MAIN

دوستان اگه اشکالی داشت بگید منتها شریع تر
امیدوارم خوب توضیح داده باشم
هدفم کمک و کسب تجربس اما اگه خوشت اومد تشکر یادت نره

کد برنامه و از http://m2soft.persiangig.com/RANGARANG.TXT بگیرید.
به امید موفقیعت شما.

$ M 3 H R D A D $
دوشنبه 12 بهمن 1388, 20:49 عصر
آقا این چه راهیه داری به بچه نشون میدی؟؟؟؟؟؟؟؟؟
عزیز دلم این کار بسیار راحته.فقط کافیه رشته مورد نظر خودت رو تو ثبات si بذاری و هر مرحله یک کاراکتر رو چاپ کنی.تقریبا یه چی تو این مایه ها میشه:

c=0
mov bx,len
l1:
mov al,byte ptr[si+c]
چاپ کاراکتر با صفت مورد نظر
cmp c,bx
jne l1

خیلی راحت.فقط c رو تو داده هات با مقدار اولیه صفر تعریف می کنی.بعد یه رشته تعریف میکنی که از ورودی بگیره.به صورت زیر:

str label byte
max db 20
len db ?
buffer db 20 dup(' ' )
dolar db "$"

که در این صورت طول واقعی رشتت تو len قرار میگیره.حداکثر طول رشتت هم تو max هستش.فقط هر اندازه که به max دادی به buffer هم همون هندازه باید بدی.
دیدی که خیلی ساده بود.
از دوستان خواهش میکنم اگه بلد نیستن نظر ندن.


مهندس تو که سوال طرف و متوجه نمیشی چرا باز شاکی هم میشی که میگی بلد نیستن جواب ندن؟
اینجا همه حق دارن هرچی میدونند بگن و به دوستاشون کمک کننند کسی هم لازم نکرده نظر اضافی بده!!!!!


دست من باشه و جای مدیر باشم این قسمت های اضافی هر پست و پاک مینم و اگه موضوع به نتیجه رسید میام قفلش مینم که جنبه بایگانی داشته باشه اما حیف که تالاره و فروم سورس کد نیست...

$ M 3 H R D A D $
شنبه 17 بهمن 1388, 09:58 صبح
داداشی هم ما رو تشویق کردی هم به خیالت ما رو شستی و پهن کردی....

من وقتم کمه و ادعایی ندارم
اینم که میام سوال دوستام و جواب میدم عجله هستش نه اینکه کل وقتم بره انجامش چون واقعا نمیرسم

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

تو توظیحاتم گفتم که کامل و بی نقض نیست

برای اون کاربری که کدش و نوشتم که نیومد یه سر بزنه به تایپیک

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