سلام خدمت دوســـتان گرامی.
من نیاز به یه برنامه با (masm) دارم که به عنوان مثال یه عدد سه رقمی که درون یک متغییر هست را ببره به مبنای 2 و در یک آرایه ذخیره کنه.
اگه میشه کمک کنید.
مرسی
.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
مرسی .واقعا لطف کردید.
یه سوال دیگه:
حالا اگه بخوایم همین عددی که در مبنای 2 در آرایه هست را به صفت کاراکتر ها در آدرس B800 نصبت بدیم طوری که بدنه پاک کردن صفحه نمایش
رنگ کاراکتر ها را عوض بشه، باید چیکار کرد؟؟؟؟
لطفا راهنمائی کنید....
بازم مـــمنون![]()
.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
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 تغییر کنه.![]()
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
در خونه های 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 را بگیره و بجای صفت کاراکتر بزاره.که شما لطف کردید و دستورات تبدیل به مبنای دوشو واسم
گذاشتید.
و میشه گفت این سه عدد که از کاربر گرفته میشه مثل همون RGB هستند.
حالا چطور این 7 بیت را باید گذاشت به جای صفت کاراکتر؟؟؟؟
چون همنطور که خودتون می دونید صفت صفحه نمایش از 8 بیت تشکیل شده که 4 بیت رنگ کاراکتر و 4 بیت دیگه رنگ
پس زمینه است.(اون یه بیت را که کم داریم را بعنوان بیت شدت رنگ پس زمینه در نظر میگیریم و همیشه 0 میزاریمش)
حالا با این تفاسیر لطفا راهنمائی کنید.![]()
.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
من یکم گیج شدم.
من باید کدوم کد های که گفتید را بنویسم تا برنامه جواب بده؟؟؟؟؟؟
چیزی که فهمیدم اینه که کد های که در پست 2 هست + این کد های که آخر نوشتید را بنویسم تا برنامه کار بده.درسته؟؟؟؟؟؟؟
پس چرا آرایه که الان تعرف کردید 4 خونه داره؟؟؟؟مگه کد باینری ما 7 بیت نیست؟؟؟؟؟؟
اگه هم امکان داره در مورد عملکرد برنامه یکم توضیح بدید.ممنون میشم.![]()
s DB 4
m DB 0
n DB 4 DUP (?)
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
.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
دوباره سلام.
و دوباره مشکل...
من برنامه ای که دادید را به روش خودم تغغیر دادم ولی مشکلات زیر را باهاش دارم:
1.اول اینکه تبدیل مبنای برنامه درست عمل نمی کنه ، مثلا عدد 123 را این برنامه اشتباه بدست میاره .چون من خودم روی کاغذ تبدیل کردم یه
چیز دیگه شد.!!!!!!!!!!!!!!
2.و وقتی برنامه را اجرا میکنم اصلا تغییر رنگی اعمال نمیکنه. و صفت کاراکتر ها تغییر نمی کنه؟؟؟؟!!!!!!
واسه رفع این مشکلات باید چیکار کنم؟؟؟؟؟؟؟
این سورس برنامه هست که با کمک سورس های شما نوشتم.
سورس را پیوست کردم.
x DB 0ah
;////////////////*100
mov al,a1
mul x
mov n,ax
[COLOR="Blue"] MOV AX, n[/COLOR]
loop_3:
MOV ES:[BX], AL
یعنی منظورتون اینه که دستورات تبدیل مبنا را حذف کنم و به خاش فقط اون تغغیراتی که گفتید را اعمال کنم؟؟؟؟؟؟؟؟؟؟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
یعنی منظورتون اینه که دستورات تبدیل مبنا را حذف کنم و به خاش فقط اون تغغیراتی که گفتید را اعمال کنم؟؟؟؟؟؟؟؟؟؟
من دستورات تبدیل را پاک کردم و قبل از loop_3 هم mov ax,n را نوشتم ولی بازم اتفاقی نیوفتاد!!!!!یعنی رنگ کاراکتر ها عوض نشد؟؟؟؟؟!!!!!!!
حالا چیکار باید بکم؟؟؟؟؟؟![]()
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
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
نه.رنگ را عوض نکرد.
من این کد ی که دادید را با debug توی cmd اجرا کردم و کار داد.واقعا ممنونم .
به عنوان آخرین درخواست:
اگر این قطعه کد را کامل واسم توضیح بدید ممنون میشم.چون این کد های که شما نوشتید واسه من نامفهومه چونکه من با یکسری از دستوراتش و کاربرودشون آشنایی ندارم.
بازم ممنون به خاطر لطفی ککه کردید.![]()
PUSH ES
MOV BX, 0B800h
MOV ES, BX
MOV CX, 80 * 25
MOV BX, 1
MOV ES:[BX], AL
ADD BX, 2
LOOP loop_3
POP ES