ورود

View Full Version : سوال: چاپ بدون استفاده از وقفه



helma20
پنج شنبه 05 دی 1387, 08:08 صبح
من می خوام یک مربع 5*5 از یه آدرس خاص به بعد چاپ کنم (بدون نیازبه وقفه و استفاده مستقیم از آدرس کارت گرافیک) اما خروجی من مربع نیست
در ضمن نمی دونم چه جوری باید بگم بعد از 5 بار چاپ کارکتر 219 برو خط بعد
ممکنه کمکم کنید؟؟؟

دقیقا همچین چیزی اما به اسمبلی



For(int i= 0;i<5;i++)
{
For(int j=0;j<5;j++)
Cout<<*;
Cout<<endl;
}














datasg segment


datasg ends



codesg segment
main proc far
assume cs:codesg, ds:datasg
mov ax,datasg
mov ds,ax



mov ah,6h
mov al,25
mov ch,0
mov cl,0
mov dh,24
mov dl,79
mov bh,07h
int 10h

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

mov al,0
mov ax,0b840h
mov ds,ax
mov si,0000h
mov ch,2
mov cl,219

lop1: cmp al,5
je end1
mov ah,0

lop2: cmp ah,5
je end2

mov [si],cl
inc si
mov [si],ch
inc si

inc ah
jmp lop2

end2: inc al
jmp lop1
end1:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov ax,4c00h
int 21h

main endp
codesg ends
end main

Open-Source
پنج شنبه 05 دی 1387, 12:22 عصر
یه توضیح :هر خط 80 کاراکتر هستش پس باید 160(80*2) بری جلو.


datasg segment


datasg ends



codesg segment
main proc far
assume cs:codesg, ds:datasg
mov ax,datasg
mov ds,ax



mov ah,6h
mov al,25
mov ch,0
mov cl,0
mov dh,24
mov dl,79
mov bh,07h
int 10h

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


mov ax,0b800h
mov ds,ax
mov si,0000h
mov ch,2
mov cl,219
mov al,0

lop1: cmp al,5
je end1
mov ah,0


lop2:
cmp ah,5
je end2

mov [si],cl
inc si
mov [si],ch
inc si

inc ah
jmp lop2

end2:
inc al

add si,150 ;160-10

jmp lop1
end1:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov ax,4c00h
int 21h

main endp
codesg ends
end main

helma20
یک شنبه 08 دی 1387, 13:44 عصر
خیلی خیلی ازتون ممنونم
برنامه را اجرا کردم کاملا درسته
اما چرا هر دفعه آدرسم به اضافه 150 شده
تعداد ستون ها 80 تاست چرا اگر به اضافه 75 بشه غلط می شه ؟؟؟؟
چرا 2 تا 75 تا؟؟؟

حالا اگه بخوام این کادر را توی برنامه ام بالا یا پایین کنم با این آدرس ها که دچار
مشکل می شم که

Open-Source
دوشنبه 09 دی 1387, 10:03 صبح
اما چرا هر دفعه آدرسم به اضافه 150 شده
چون که مربع خودت 5 تاست که ضربدر 2 بکنید میشه 10 تا.
80 رو که ضربدر 2 بکنیم میشه 160.
160-10=150 .

Open-Source
دوشنبه 09 دی 1387, 10:04 صبح
حالا اگه بخوام این کادر را توی برنامه ام بالا یا پایین کنم با این آدرس ها که دچار
مشکل می شم که

چه مشکلی؟؟!!!!
یه کم واضح تر توضیح بده ...

helma20
چهارشنبه 11 دی 1387, 00:21 صبح
مثلا می خوام یه کارد 7 *7 را ذخیره کنم

نمی دونم اشکال کارم کجاست ؟





;tem1 dw 0162
;buf dw 49 dup (?),'$'


lea di,buf
mov dx,0b810h
mov bl,0
loop1: cmp bl,7
je endloop1
mov bh,0
loop2: cmp bh,7
je loop1
sub tem1,dx
mov dx,tem1
mov [di],[dx]
add di,2
add dx,2
inc bh
jmp loop2

Open-Source
چهارشنبه 11 دی 1387, 17:21 عصر
ببین اگه کد کامل برنامه ات رو بزاری خیلی بهتره .آخه یه سال طول میکشه که....

Open-Source
چهارشنبه 11 دی 1387, 17:26 عصر
datasg segment


datasg ends



codesg segment
main proc far
assume cs:codesg, ds:datasg
mov ax,datasg
mov ds,ax



mov ah,6h
mov al,25
mov ch,0
mov cl,0
mov dh,24
mov dl,79
mov bh,07h
int 10h

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


mov ax,0b840h
mov ds,ax
mov si,0000h
mov ch,2
mov cl,219
mov al,0

lop1: cmp al,7
je end1
mov ah,0


lop2:
cmp ah,7
je end2

mov [si],cl
inc si
mov [si],ch
inc si

inc ah
jmp lop2

end2:
inc al

add si,146 ;160-14

jmp lop1
end1:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov ax,4c00h
int 21h

main endp
codesg ends
end main


من نمیدونم شاید این کد رو میخواستی؟؟!!
یه نگاهی بنداز(مانند کد قبله با این تفاوت که 7*7 هستش).

منظورت رو هم از ذخیره کردن واضح تر بگو.

lizbazar
شنبه 08 فروردین 1388, 00:39 صبح
برای دسترسی مستقیم به کارت گرافیک باید از آدرس A000h استفاده کنی . و در es قرار بدی .
برای set کردن یک پیکسل با رنگ و مختصات خاص باید اینطور عمل کنی یعنی » offset = y*320 +x
رنگ دلخواه رو هم از همون جدول attribute که در مد text دوستان گفتن درمیاری . یه کدی به این شکل در میاد .

les DI, Screen { load the Screen buffer pointer }
add DI, X { Add in the X offset }


mov AX, Y { Load Y into AX }
shl AX, 6 { AX = Y*64 }
add DI, AX { DI = X+Y*64 }
shl AX, 2 { AX = Y*64*4 = Y*256 }
add DI, AX { DI = X+Y*64+Y*256 }


mov AL, Color { Load the color into AX }
mov ES:[DI], AL { Write to the VGA }



برای دسترسی مستقیم روی همین آدرس A000h کارکن.

dehdashtabadan
یک شنبه 24 آبان 1388, 13:16 عصر
سلام:
تروخداکمکم کنین
برنامه ای بنویسید که اطلاعات آدرس 0b800hرابدون استفاده از وقفه به پرینتر ارسال کند
ممنون