سلام به همه دوستای گلم
تیکه به تیکه کد و مینویسم بعدش توضیحاتشو.
.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 بگیرید.
به امید موفقیعت شما.