ورود

View Full Version : سوال: کشیدن یک مستطیل طبق اطلاعات کاربر در emu8086 خواهش میکنم زود پاسخ بدید. ضروریه



ZahraTaak
پنج شنبه 08 خرداد 1393, 19:39 عصر
سلام امیدوارم حالتون خوب باشه. لطفا خیلی زود به این سوالم پاسخ بدید. خواهش میکنم. لطفا اگه بلدید. کد برنامه ای که میگم رو برام بنویسید. با .emulate8086 برنامه ای بنویسید که طول و عرض یک مستطیل را از کاربر گرفته و ان مستطیل را در وسط صفحه چاپ کند در وسط ان محیط و مساحت ان را چا پ کند.

vahid-p
جمعه 09 خرداد 1393, 01:03 صبح
این کد با مختصات نقطه بالا سمت چپ ( x1,y1 ) و نقطه پایین سمت راست ( x2,y2 ) مستطیل قرمز رنگی رو درج میکنه. حالا گرفتن عدد و قرار دادن تو این متغیر ها رو خودتون انجام بدید یا هم کدش رو با یه سرچ پیدا کنید.
و برای نوشتن مساحت و محیط وسط صفحه از
INT 10h / AH = 2 - set cursor position.
input:
DH = row.
DL = column.
BH = page number (0..7).

استفاده کنید. اول cursor رو با این فانکشن به وسط صفحه منتقل کنید و بعد از اون مقادیر مساحت و محیط رو با فانکشن INT 21h/Ah=2 درج کنید.




data segment
; add your data here!
x1 dw 0
x2 dw 0
y1 dw 0
y2 dw 0
ends

stack segment
dw 128 dup(0)
ends

code segment
start:
; set segment registers:
mov ax, data
mov ds, ax
mov es, ax

mov ah,0
mov al,13h ;Graphical mode
int 10h

mov x1,4
mov y1,5
mov x2,75
mov y2,100
call drawRectangle

mov ax, 4c00h ; exit to operating system.
int 21h

proc drawRectangle
mov bx,x1
mov al, 1100b
label1:
mov cx, bx
mov dx, y1
mov ah, 0ch
int 10h ; set pixel.
mov dx,y2
int 10h
inc bx
cmp bx,x2
jng label1
mov bx,y1
mov al,1100b
label2:
mov cx,x1
mov dx,bx
mov ah,0ch
int 10h
mov cx,x2
int 10h
inc bx
cmp bx,y2
jng label2
ret
endp

ends

end start ; set entry point and stop the assembler.

ZahraTaak
جمعه 09 خرداد 1393, 12:30 عصر
این کد با مختصات نقطه بالا سمت چپ ( x1,y1 ) و نقطه پایین سمت راست ( x2,y2 ) مستطیل قرمز رنگی رو درج میکنه. حالا گرفتن عدد و قرار دادن تو این متغیر ها رو خودتون انجام بدید یا هم کدش رو با یه سرچ پیدا کنید. و برای نوشتن مساحت و محیط وسط صفحه از INT 10h / AH = 2 - set cursor position.
input: DH = row. DL = column. BH = page number (0..7). استفاده کنید. اول cursor رو با این فانکشن به وسط صفحه منتقل کنید و بعد از اون مقادیر مساحت و محیط رو با فانکشن INT 21h/Ah=2 درج کنید.
data segment ; add your data here! x1 dw 0 x2 dw 0 y1 dw 0 y2 dw 0 ends stack segment dw 128 dup(0) ends code segment start: ; set segment registers: mov ax, data mov ds, ax mov es, ax mov ah,0 mov al,13h ;Graphical mode int 10h mov x1,4 mov y1,5 mov x2,75 mov y2,100 call drawRectangle mov ax, 4c00h ; exit to operating system. int 21h proc drawRectangle mov bx,x1 mov al, 1100b label1: mov cx, bx mov dx, y1 mov ah, 0ch int 10h ; set pixel. mov dx,y2 int 10h inc bx cmp bx,x2 jng label1 mov bx,y1 mov al,1100b label2: mov cx,x1 mov dx,bx mov ah,0ch int 10h mov cx,x2 int 10h inc bx cmp bx,y2 jng label2 ret endp ends end start ; set entry point and stop the assembler. عذر میخوام. فقط میشه بگید این کد رو باید کجای دستوری که لطف کردید گفتید اضافه کنم؟ من این کد رو میذارم بعد از دستور فراخوانی مستطیل اما اجراش نمیکنه. میخوام بعد ازینکه مستطیل رو کشید خودم وسطش محیط و مساحتش رو بنویسم.. خواهش میکنم جواب این سوالمم بدید اینکه وقتی دستور وارد کرد اطلاعات از کاربر رو نوشتم چه طور ربطش بدم به مستطیله تا همون اندازه که کاربر داده بکشه؟ لطفا افراد دیگه هم اگه بلدند کمکم کنند ممنون میشم واقعا

ZahraTaak
جمعه 09 خرداد 1393, 12:43 عصر
عذر میخوام. فقط میشه بگید این کد رو باید کجای دستوری که لطف کردید گفتید اضافه کنم؟ من این کد رو میذارم بعد از دستور فراخوانی مستطیل اما اجراش نمیکنه. میخوام بعد ازینکه مستطیل رو کشید خودم وسطش محیط و مساحتش رو بنویسم.. خواهش میکنم جواب این سوالمم بدید اینکه وقتی دستور وارد کرد اطلاعات از کاربر رو نوشتم چه طور ربطش بدم به مستطیله تا همون اندازه که کاربر داده بکشه؟ لطفا افراد دیگه هم اگه بلدند کمکم کنند ممنون میشم واقعا:




mov dh,8
mov dl,25
mov bh,2
mov ah,2h
int 10h

vahid-p
جمعه 09 خرداد 1393, 16:52 عصر
شما page رو 2 انتخاب کردید. در صورتی که page 0 هست. بعد هم اینکه در این صفحه که 40*25 کاراکتر هست، وسطش 8 و 25 نیست. تازه این فقط cursor رو جابه جا میکنه، بعد از اون باید بنویسید.
من این کد رو تکمیل کردم، فقط شما باید نقاط x1,y1 و همچنین x2,y2 رو باید بدست بیارید تا مستطیل وسط صفحه باشه و همچنین مقادیر مساحت و محیط رو بنویسید. مساحت و محیط رو اینجا با p , s وسط صفحه نشون دادم. یکم تغییر بدید جوابتون رو خواهید گرفت. شما این کد رو اجرا کنید، متوجه میشید :


data segment
; add your data here!
x1 dw 0
x2 dw 0
y1 dw 0
y2 dw 0
ends

stack segment
dw 128 dup(0)
ends

code segment
start:
; set segment registers:
mov ax, data
mov ds, ax
mov es, ax

mov ah,0
mov al,13h ;Graphical mode
int 10h

mov x1,4
mov y1,5
mov x2,75
mov y2,100
call drawRectangle
;move cursor to middle of page
mov dh,12
mov dl,20
mov bh,0
mov ah,2
int 10h
;print periphery
mov dl,'P'
mov ah,02h
int 21h
;mov cursor to next line
mov dh,13
mov dl,20
mov bh,0
mov ah,2
int 10h
;print space ( area )
mov dl,'S'
mov ah,02h
int 21h

; exit to operating system.
mov ax, 4c00h
int 21h

proc drawRectangle
mov bx,x1
mov al, 1100b
label1:
mov cx, bx
mov dx, y1
mov ah, 0ch
int 10h ; set pixel.
mov dx,y2
int 10h
inc bx
cmp bx,x2
jng label1
mov bx,y1
mov al,1100b
label2:
mov cx,x1
mov dx,bx
mov ah,0ch
int 10h
mov cx,x2
int 10h
inc bx
cmp bx,y2
jng label2
mov dh,8
ret
endp

ends

end start ; set entry point and stop the assembler.

ZahraTaak
جمعه 09 خرداد 1393, 17:53 عصر
mishe inam tozih bedid ke ah=02h,int=21h chikar mikone?mamnunam vaghean

emadrezvani
شنبه 10 خرداد 1393, 08:52 صبح
mishe inam tozih bedid ke ah=02h,int=21h chikar mikone?mamnunam vaghean
http://spike.scu.edu.au/~barry/interrupts.html#ah02