تبدیل یه عدد 3 رقمی به مبنای دو در (masm)؟؟؟

SajadCG

کاربر فعال
سلام خدمت دوســـتان گرامی.

من نیاز به یه برنامه با (masm) دارم که به عنوان مثال یه عدد سه رقمی که درون یک متغییر هست را ببره به مبنای 2 و در یک آرایه ذخیره کنه.
اگه میشه کمک کنید.:rose:
مرسی
 

the_king

مدیرکل انجمن
سلام خدمت دوســـتان گرامی.

من نیاز به یه برنامه با (masm) دارم که به عنوان مثال یه عدد سه رقمی که درون یک متغییر هست را ببره به مبنای 2 و در یک آرایه ذخیره کنه.
اگه میشه کمک کنید.:rose:
مرسی

عدد رو مدام به 2 تقسیم می کنیم و باقیمانده تقسیم رو که 0 یا 1 خواهد بود در پشته Push می کنیم تا زمانی که
به صفر برسیم. این ارقام ای که Push می کنیم رقم های مبنای 2 عدد مورد نظر هستند، اما با ترتیب
راست به چپ. سپس آنها را یکی یکی از داخل پشته Pop کرده و در آرایه قرار می دهیم تا با ترتیب چپ به راست
ثبت شوند.

اگر بخواهیم حاصل را نمایش دهیم، برای استفاده از سرویس 9 وقفه 21h یک کاراکتر $ هم به انتهای آرایه
اضافه می کنیم تا انتهای رشته مشخص شود.

کد:
.MODEL SMALL
.DATA
	n DW 475
	b DB 11 DUP (?)
.CODE
	.STARTUP
	MOV	AX, n
	MOV	CX, 0
	MOV	BX, 2
loop_1:
	MOV	DX, 0
	DIV	BX
	PUSH	DX
	INC	CX
	CMP	AX, 0
	JNE	loop_1
	MOV	BX, 0
loop_2:
	POP	AX
	ADD	AL, '0'
	MOV	b[BX], AL
	INC	BX
	LOOP	loop_2

	MOV	BYTE PTR b[BX], '$'
	MOV	AH, 9
	LEA	DX, b
	INT	21h
	.EXIT
.STACK
END
 

SajadCG

کاربر فعال
مرسی .واقعا لطف کردید.
یه سوال دیگه:

حالا اگه بخوایم همین عددی که در مبنای 2 در آرایه هست را به صفت کاراکتر ها در آدرس B800 نصبت بدیم طوری که بدنه پاک کردن صفحه نمایش
رنگ کاراکتر ها را عوض بشه، باید چیکار کرد؟؟؟؟
لطفا راهنمائی کنید....

بازم مـــمنون:rose:
 

the_king

مدیرکل انجمن
مرسی .واقعا لطف کردید.
یه سوال دیگه:

حالا اگه بخوایم همین عددی که در مبنای 2 در آرایه هست را به صفت کاراکتر ها در آدرس B800 نصبت بدیم طوری که بدنه پاک کردن صفحه نمایش
رنگ کاراکتر ها را عوض بشه، باید چیکار کرد؟؟؟؟
لطفا راهنمائی کنید....

بازم مـــمنون:rose:

0 و 1 خودشون مستقیما رنگ مناسبی نیستند، 0 مشکی روی زمینه مشکی است و 1 هم رنگ آبی روی زمینه مشکی.
برای مثال از رنگ 1Eh (زرد روی زمینه آبی) برای 1 و رنگ 12h (سبز روی زمینه آبی) برای 0 استفاده کردم :

کد:
.MODEL SMALL
.DATA
	n DW 475
	b DB 11 DUP (?)
.CODE
	.STARTUP
	MOV	AX, n
	MOV	CX, 0
	MOV	BX, 2
loop_1:
	MOV	DX, 0
	DIV	BX
	PUSH	DX
	INC	CX
	CMP	AX, 0
	JNE	loop_1
	MOV	BX, 0
loop_2:
	POP	AX
	ADD	AL, '0'	
	MOV	b[BX], AL
	INC	BX
	LOOP	loop_2

	MOV	BYTE PTR b[BX], '$'
	MOV	BX, 0
	PUSH	ES
	MOV	AX, 0B800h
	MOV	ES, AX
	MOV	SI, 160 * 10
loop_3:
	MOV	AL, b[BX]
	MOV	ES:[SI], AL
	MOV	AH, 1Eh
	CMP	AL, '1'
	JE	next_1
	MOV	AH, 12h
next_1:
	MOV	ES:[SI + 1], AH
	ADD	SI, 2
	INC	BX
	CMP	BYTE PTR b[BX], '$'
	JNE	loop_3
	POP	ES
	.EXIT
.STACK
END
 

SajadCG

کاربر فعال
0 و 1 خودشون مستقیما رنگ مناسبی نیستند، 0 مشکی روی زمینه مشکی است و 1 هم رنگ آبی روی زمینه مشکی.
برای مثال از رنگ 1Eh (زرد روی زمینه آبی) برای 1 و رنگ 12h (سبز روی زمینه آبی) برای 0 استفاده کردم :

کد:
.MODEL SMALL
.DATA
	n DW 475
	b DB 11 DUP (?)
.CODE
	.STARTUP
	MOV	AX, n
	MOV	CX, 0
	MOV	BX, 2
loop_1:
	MOV	DX, 0
	DIV	BX
	PUSH	DX
	INC	CX
	CMP	AX, 0
	JNE	loop_1
	MOV	BX, 0
loop_2:
	POP	AX
	ADD	AL, '0'	
	MOV	b[BX], AL
	INC	BX
	LOOP	loop_2

	MOV	BYTE PTR b[BX], '$'
	MOV	BX, 0
	PUSH	ES
	MOV	AX, 0B800h
	MOV	ES, AX
	MOV	SI, 160 * 10
loop_3:
	MOV	AL, b[BX]
	MOV	ES:[SI], AL
	MOV	AH, 1Eh
	CMP	AL, '1'
	JE	next_1
	MOV	AH, 12h
next_1:
	MOV	ES:[SI + 1], AH
	ADD	SI, 2
	INC	BX
	CMP	BYTE PTR b[BX], '$'
	JNE	loop_3
	POP	ES
	.EXIT
.STACK
END

خیلی ممنون.

ولی من می خوام این برنامه جوری باشه اون 7 بیتی که در متغیر b هست رو به جای 7 بیتی که مال خصوصیت
کاراکتر ها است بزاره.
به عنوان مثال اگر 0011101 در متغبر b باشه ، و صفت کاراکتر صفحه نمایش 1011000 باشه، این برنامه طوری عمل
کنه که صفت کاراکتر صفحه نماش به بیت های در مورن متغییر b تغییر کنه.:wink:
 

the_king

مدیرکل انجمن
خیلی ممنون.

ولی من می خوام این برنامه جوری باشه اون 7 بیتی که در متغیر b هست رو به جای 7 بیتی که مال خصوصیت
کاراکتر ها است بزاره.
به عنوان مثال اگر 0011101 در متغبر b باشه ، و صفت کاراکتر صفحه نمایش 1011000 باشه، این برنامه طوری عمل
کنه که صفت کاراکتر صفحه نماش به بیت های در مورن متغییر b تغییر کنه.:wink:

در خونه های b که فقط 00000001 یا 00000000 قرار می گیرند. :-?
صورت سوال برنامه مبهمه، شما یک عدد سه رقمی که بین 000 الی 999 است رو بصورت باینری در آرایه b می نویسید که
حداکثر 10 رقمی است. حالا اگر این 0 و 1 ها رو در صفحه در صفت کاراکتر ها بنویسید loop_3 اینطوری تغییر می کنه :
کد:
loop_3:
	MOV	AL, b[BX]
	SUB	AL, '0'
	MOV	ES:[SI + 1], AL
	ADD	SI, 2
	INC	BX
	CMP	BYTE PTR b[BX], '$'
	JNE	loop_3
 

SajadCG

کاربر فعال
در خونه های b که فقط 00000001 یا 00000000 قرار می گیرند. :-?
صورت سوال برنامه مبهمه، شما یک عدد سه رقمی که بین 000 الی 999 است رو بصورت باینری در آرایه b می نویسید که
حداکثر 10 رقمی است. حالا اگر این 0 و 1 ها رو در صفحه در صفت کاراکتر ها بنویسید loop_3 اینطوری تغییر می کنه :
کد:
loop_3:
	MOV	AL, b[BX]
	SUB	AL, '0'
	MOV	ES:[SI + 1], AL
	ADD	SI, 2
	INC	BX
	CMP	BYTE PTR b[BX], '$'
	JNE	loop_3

صورت این برنامه به شکل زیر است:

برنامه که یه عدد 0 تا 255 را بگیره و بجای صفت کاراکتر بزاره.که شما لطف کردید و دستورات تبدیل به مبنای دوشو واسم
گذاشتید.:neutral:
و میشه گفت این سه عدد که از کاربر گرفته میشه مثل همون RGB هستند.
حالا چطور این 7 بیت را باید گذاشت به جای صفت کاراکتر؟؟؟؟


چون همنطور که خودتون می دونید صفت صفحه نمایش از 8 بیت تشکیل شده که 4 بیت رنگ کاراکتر و 4 بیت دیگه رنگ
پس زمینه است.(اون یه بیت را که کم داریم را بعنوان بیت شدت رنگ پس زمینه در نظر میگیریم و همیشه 0 میزاریمش)
حالا با این تفاسیر لطفا راهنمائی کنید.:rose:
 

the_king

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

برنامه که یه عدد 0 تا 255 را بگیره و بجای صفت کاراکتر بزاره.که شما لطف کردید و دستورات تبدیل به مبنای دوشو واسم
گذاشتید.:neutral:
و میشه گفت این سه عدد که از کاربر گرفته میشه مثل همون RGB هستند.
حالا چطور این 7 بیت را باید گذاشت به جای صفت کاراکتر؟؟؟؟


چون همنطور که خودتون می دونید صفت صفحه نمایش از 8 بیت تشکیل شده که 4 بیت رنگ کاراکتر و 4 بیت دیگه رنگ
پس زمینه است.(اون یه بیت را که کم داریم را بعنوان بیت شدت رنگ پس زمینه در نظر میگیریم و همیشه 0 میزاریمش)
حالا با این تفاسیر لطفا راهنمائی کنید.:rose:

قضیه فرق کرد، شما از کاربر یک رشته دریافت می کنید، مثلا "123" و بعد باید این رشته رو به عدد تبدیل کنیم،
یعنی بایت 123 و بعد در تمام صفحه نمایش صفت کاراکتر ها را روی 123 تنظیم می کنیم، صرف نظر از اینکه کدام
بیت ها برای رنگ کاراکتر اند و کدام ها برای زمینه

کد:
.MODEL SMALL
.DATA
	s DB 4
	m DB 0
	n DB 4 DUP (?)
.CODE
	.STARTUP
	MOV	AH, 0Ah
	LEA	DX, s
	INT	21h
	MOV	BX, 0
	MOV	AL, 0
	MOV	CL, 10
loop_1:
	CMP	BL, m
	JE	next_1
	MUL	CL
	ADD	AL, n[BX]
	SUB	AL, '0'
	INC	BX
	JMP	loop_1
next_1:
	PUSH	ES
	MOV	BX, 0B800h
	MOV	ES, BX
	MOV	CX, 80 * 25
	MOV	BX, 1
loop_2:
	MOV	ES:[BX], AL
	ADD	BX, 2
	LOOP	loop_2
	POP	ES
	.EXIT
.STACK
END
 

SajadCG

کاربر فعال
من یکم گیج شدم.:-?
من باید کدوم کد های که گفتید را بنویسم تا برنامه جواب بده؟؟؟؟؟؟

چیزی که فهمیدم اینه که کد های که در پست 2 هست + این کد های که آخر نوشتید را بنویسم تا برنامه کار بده.درسته؟؟؟؟؟؟؟
پس چرا آرایه که الان تعرف کردید 4 خونه داره؟؟؟؟مگه کد باینری ما 7 بیت نیست؟؟؟؟؟؟

اگه هم امکان داره در مورد عملکرد برنامه یکم توضیح بدید.ممنون میشم.:rose:
 

the_king

مدیرکل انجمن
من یکم گیج شدم.:-?
من باید کدوم کد های که گفتید را بنویسم تا برنامه جواب بده؟؟؟؟؟؟

چیزی که فهمیدم اینه که کد های که در پست 2 هست + این کد های که آخر نوشتید را بنویسم تا برنامه کار بده.درسته؟؟؟؟؟؟؟
پس چرا آرایه که الان تعرف کردید 4 خونه داره؟؟؟؟مگه کد باینری ما 7 بیت نیست؟؟؟؟؟؟

اگه هم امکان داره در مورد عملکرد برنامه یکم توضیح بدید.ممنون میشم.:rose:

این آخرین کدی که نوشتم مطابق با صورت سوالی بود که گفتید. ما اول از کاربر یک رشته دریافت می کنیم که بعدا به
عدد معادلش تبدیل میشه. سرویس 0Ah وقفه 21h یک رشته رو از ورودی می گیره و در یک آرایه قرار میده اما
ساختار آرایه ای که از شما می گیرد سه بخش داره، بایت اول طول حداکثری رشته، بایت دوم تعداد کاراکتر های
دریافت شده از کاربر و بعدش تازه آرایه ای که کاراکتر ها داخلش ثبت میشه :
کد:
	s DB 4
	m DB 0
	n DB 4 DUP (?)
این ساختاری است که اون سرویس باهاش کار می کنه.
بخش اول حداکثر طول رشته ای است که دریافت میشه + یک کاراکتر 13 که مربوط به کلید Enter است.
یعنی وقتی شما در s مقدار 4 را می نویسید، سرویس 0Ah متوجه میشه که باید یک رشته حداکثر سه رقمی +
یک کاراکتر 13 رو ثبت کنه، نه بیشتر. فرضا نمی توانید یک عدد چهار رقمی تایپ کنید. اگر در s عدد 3 رو می نوشتیم
حداکثر یک عدد 2 رقمی رو دریافت می کرد، چون اون کاراکتر 13 انتهای رشته باید در آرایه جا بشه.

در بخش دوم یعنی m تعداد کاراکتر هایی ثبت میشه که سرویس از کاربر دریافت کرده، البته بدون در نظر گرفتن اون
کاراکتر 13 انتهای رشته. فرضا اگر عدد 12 رو دریافت کنه، m برابر 2 خواهد بود، یعنی دو رقم.

بخش سوم هم آرایه ای است که رشته داخلش ثبت میشه، انتهایش هم یک کاراکتر 13 قرار می گیره.

دریافت رشته از کاربر :
کد:
	MOV	AH, 0Ah
	LEA	DX, s
	INT	21h

تبدیل کردن رشته به عدد معادلش، یکان و دهگان و صدگان :
کد:
	MOV	BX, 0
	MOV	AL, 0
	MOV	CL, 10
loop_1:
	CMP	BL, m
	JE	next_1
	MUL	CL
	ADD	AL, n[BX]
	SUB	AL, '0'
	INC	BX
	JMP	loop_1

ثبت کردن اون عدد (یک بایت) در صفت کاراکتر ها در 25 سطر 80 ستونی :
کد:
next_1:
	PUSH	ES
	MOV	BX, 0B800h
	MOV	ES, BX
	MOV	CX, 80 * 25
	MOV	BX, 1
loop_2:
	MOV	ES:[BX], AL
	ADD	BX, 2
	LOOP	loop_2
	POP	ES
 

SajadCG

کاربر فعال
دوباره سلام.:rose:
و دوباره مشکل...:lol:

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

1.اول اینکه تبدیل مبنای برنامه درست عمل نمی کنه ، مثلا عدد 123 را این برنامه اشتباه بدست میاره .چون من خودم روی کاغذ تبدیل کردم یه
چیز دیگه شد.!!!!!!!!!!!!!!:cry:
2.و وقتی برنامه را اجرا میکنم اصلا تغییر رنگی اعمال نمیکنه. و صفت کاراکتر ها تغییر نمی کنه؟؟؟؟!!!!!!:cry:

واسه رفع این مشکلات باید چیکار کنم؟؟؟؟؟؟؟:cool:

این سورس برنامه هست که با کمک سورس های شما نوشتم.
.model small
.stack 500
.data
;*********************************************
a1 DB 0
a2 DB 0
a3 DB 0
x DB 0ah
y DB 64h

n DW 0
b DB 11 DUP (?)
;***************************************
.code
Main PROC far
.startup
s1:
;////////////////get number 1
mov ah,01
int 21h
sub al,48
mov a1,al
;////////////////get number2
mov ah,01
int 21h
sub al,48
mov a2,al
;////////////////get number 3
mov ah,01
int 21h
sub al,48
mov a3,al
;////////////////*100
mov al,a1
mul x
mov n,ax
;/////////////////*10
mov al,a2
mul y
add n,ax
;/////////////////+s
mov al,a3
mov ah,0
add n,ax
;////////////////////////////////////////////////[convert to Binary]
MOV AX, n
MOV CX, 0
MOV BX, 2
loop_1:
MOV DX, 0
DIV BX
PUSH DX
INC CX
CMP AX, 0
JNE loop_1
MOV BX, 0
loop_2:
POP AX
ADD AL, '0'
MOV b[BX], AL
INC BX
LOOP loop_2
next_1:
PUSH ES
MOV BX, 0B800h
MOV ES, BX
MOV CX, 80 * 25
MOV BX, 1
loop_3:
MOV ES:[BX], AL
ADD BX, 2
LOOP loop_3
POP ES
.Exit
Main endp
end main​

سورس را پیوست کردم.
 

پیوست ها

  • M.rar
    513 بایت · بازدیدها: 0
آخرین ویرایش:

the_king

مدیرکل انجمن
دوباره سلام.:rose:
و دوباره مشکل...:lol:

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

1.اول اینکه تبدیل مبنای برنامه درست عمل نمی کنه ، مثلا عدد 123 را این برنامه اشتباه بدست میاره .چون من خودم روی کاغذ تبدیل کردم یه
چیز دیگه شد.!!!!!!!!!!!!!!:cry:
2.و وقتی برنامه را اجرا میکنم اصلا تغییر رنگی اعمال نمیکنه. و صفت کاراکتر ها تغییر نمی کنه؟؟؟؟!!!!!!:cry:

واسه رفع این مشکلات باید چیکار کنم؟؟؟؟؟؟؟:cool:

این سورس برنامه هست که با کمک سورس های شما نوشتم.


سورس را پیوست کردم.

a1 رقم صدگان عدده، باید در 100 ضرب اش کنید، شما در x ضرب اش می کنید که 10 ئه :
کد:
 x DB 0ah

 ;////////////////*100
 mov al,a1 
 mul x
 mov n,ax

در ضمن تبدیل عدد به باینری اینجا هیچ کاربردی نداره، شما که نمی توانید 11 بایت که اونم بصورت رشته
درآوردید رو در یک بایت بنویسید، شما باید همان n رو مستقیما در صفت کاراکتر بنویسید، اون حلقه loop1
برای نمایش معادل باینری روی صفحه خوبه، برای صفت کاراکتر مناسب نیست. قبل از Loop_3 مقدار n
رو در AX قرار دهید :
کد:
[COLOR="Blue"] MOV AX, n[/COLOR]
loop_3:
 MOV ES:[BX], AL
 

SajadCG

کاربر فعال
a1 رقم صدگان عدده، باید در 100 ضرب اش کنید، شما در x ضرب اش می کنید که 10 ئه :
کد:
 x db 0ah

 ;////////////////*100
 mov al,a1 
 mul x
 mov n,ax

در ضمن تبدیل عدد به باینری اینجا هیچ کاربردی نداره، شما که نمی توانید 11 بایت که اونم بصورت رشته
درآوردید رو در یک بایت بنویسید، شما باید همان n رو مستقیما در صفت کاراکتر بنویسید، اون حلقه loop1
برای نمایش معادل باینری روی صفحه خوبه، برای صفت کاراکتر مناسب نیست. قبل از loop_3 مقدار n
رو در ax قرار دهید :
کد:
[color="blue"] mov ax, n[/color]
loop_3:
 Mov es:[bx], al
یعنی منظورتون اینه که دستورات تبدیل مبنا را حذف کنم و به خاش فقط اون تغغیراتی که گفتید را اعمال کنم؟؟؟؟؟؟؟؟؟؟
 

the_king

مدیرکل انجمن
یعنی منظورتون اینه که دستورات تبدیل مبنا را حذف کنم و به خاش فقط اون تغغیراتی که گفتید را اعمال کنم؟؟؟؟؟؟؟؟؟؟

بله، به نظر من در سوال منظور از باینری این نبوده که عدد رو به یک آرایه چندین بایتی 0 و 1 تبدیل کنید، منظور این بوده
که عدد سه رقمی بین 0 الی 255 رو بصورت یک بایت در بیاورید.
 

SajadCG

کاربر فعال
من دستورات تبدیل را پاک کردم و قبل از loop_3 هم mov ax,n را نوشتم ولی بازم اتفاقی نیوفتاد!!!!!یعنی رنگ کاراکتر ها عوض نشد؟؟؟؟؟!!!!!!!

حالا چیکار باید بکم؟؟؟؟؟؟:cry:
 

the_king

مدیرکل انجمن
من دستورات تبدیل را پاک کردم و قبل از loop_3 هم mov ax,n را نوشتم ولی بازم اتفاقی نیوفتاد!!!!!یعنی رنگ کاراکتر ها عوض نشد؟؟؟؟؟!!!!!!!

حالا چیکار باید بکم؟؟؟؟؟؟:cry:

وقتی کد قبلی رو که من نوشته بودم اجرا می کردید رنگ کاراکتر ها عوض می شد؟
اینجور برنامه ها رو یا در محیط DOS اجرا کنید، یا در ویندوز برای اجرا کردن شون از ابزار DOSBox استفاده کنید.

کد:
model small
 .stack 500
 .data
 ;*********************************************
 a1 DB 0
 a2 DB 0
 a3 DB 0
 x DB 0ah
 y DB 64h

 n DW 0
 b DB 11 DUP (?)
 ;***************************************
 .code
 Main PROC far
 .startup
 s1:
 ;////////////////get number 1
 mov ah,01
 int 21h
 sub al,48
 mov a1,al
 ;////////////////get number2
 mov ah,01
 int 21h
 sub al,48
 mov a2,al
 ;////////////////get number 3
 mov ah,01
 int 21h
 sub al,48
 mov a3,al
 ;////////////////*100
 mov al,a1 
 mul y
 mov n,ax
 ;/////////////////*10
 mov al,a2 
 mul x
 add n,ax
 ;/////////////////+s
 mov al,a3
 mov ah,0
 add n,ax
 ;////////////////////////////////////////////////[Write on the screen]
 MOV AX, n
 PUSH ES
 MOV BX, 0B800h
 MOV ES, BX
 MOV CX, 80 * 25
 MOV BX, 1
 loop_3:
 MOV ES:[BX], AL
 ADD BX, 2
 LOOP loop_3
 POP ES
 .Exit
 Main endp
 end main
 

SajadCG

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

بازم ممنون به خاطر لطفی ککه کردید.:rose:
PUSH ES
MOV BX, 0B800h
MOV ES, BX
MOV CX, 80 * 25
MOV BX, 1
loop_3:
MOV ES:[BX], AL
ADD BX, 2
LOOP loop_3
POP ES
 

the_king

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

بازم ممنون به خاطر لطفی ککه کردید.:rose:

ES رجیستر مهمی یه، تغییر دادنش ممکنه روال های دیگر رو با مشکل مواجه کنه، به همین جهت اگر مقدارش را
عوض کردید بعد از آنکه کارتان باهاش تمام شد حتما به مقدار قبلی اش برگردانید. با دستور PUSH مقدار فعلی اش
را پیش از آنکه عوض اش کنیم در پشته قرار می دهیم تا بعدا که کارمان با ES تمام شد با POP کردن به مقدار
قبلی برگردانیم :
کد:
PUSH ES

امکان نوشتن مستقیم مقدار در ES وجود ندارد، مثلا نمی توانیم بنویسیم MOV ES, 0B800h چون پردازنده چنین
دستوری را قبول نمی کند. باید از یک رجیستر دیگر کمک بگیریم. به همین دلیل از BX به عنوان واسطه
استفاده می کنیم :
کد:
 MOV BX, 0B800h
 MOV ES, BX

صفحه نمایش متنی استاندارد 25 سطر و 80 ستون دارد، حلقه ما باید به تعداد کل کاراکتر ها تکرار شود تا صفحه کاراکتر
در کل صفحه نمایش را عوض کند :
کد:
 MOV CX, 80 * 25

در حافظه صفحه نمایش به ترتیب کاراکتر نمایشی، صفت کاراکتر، کاراکتر نمایشی، صفت کاراکتر، کاراکتر نمایشی...
قرار دارند. اندیس های زوج [BX] کاراکتر نمایشی و اندیس های فرد صفت کاراکتر هستند، پس BX را 1
شروع می کنیم، نه از 0 چون اگر از از صفر شروع کنیم [ES:[BX روی کاراکتر نمایشی قرار می گیرد، نه صفت کاراکتر.
کد:
 MOV BX, 1

ES را قبلا روی سگمنت 0B800h تنظیم کرده ایم، BX را هم روی اندیس صفت کاراکتر قرار داده ایم، AL را هم که
عدد n است. مقدار n را در صفت کاراکتر ثبت می کنیم :
کد:
 MOV ES:[BX], AL

صفت کاراکتر بعدی دو بایت جلوتر قرار دارد :
کد:
 ADD BX, 2

حلقه 80 * 25 بار تکرار می شود :
کد:
 LOOP loop_3

مقدار قبلی ES را از پشته خارج کرده و در ES قرار می دهیم :
کد:
 POP ES
 

جدیدترین ارسال ها

بالا