sjhosseini
دوشنبه 25 آبان 1388, 16:33 عصر
سلام
من یه ماکرو نوشتم که بر اساس الگوریتم Bresenham خطی را رسم می کنه. چهارتا آرگومان دریافت می کنه و اینکار رو میکنه. حالا فقط می خوام این ماکرو رو توی ماکرو دیگه ای چهار بار صدا کنم تا چهارضلعی رسم کنه . اون ماکرو هم چهار تا آرگومان میگره . مثلا تابع Regtangle توی زبان C.
من میخوام چهارتا آرگومان تابع مستطیل رو به تابع رسم خط بفرستم . ارور میده.
اسمبلی رو تازه چند روزه که شروع کردم نمی دونم چرا نمیشه. هنوز هم انتظار دارم مثل زبان C زبان منو خوب بفهمه ولی نمی فهمه.
به جای این که محتویات آرگومان ها رو به ماکرو رسم خط بفرسته ، خودشو میفرسته (اسم خودشو)
چاره چیه؟؟؟؟؟؟
Rectangle macro x1,y1,x2,y2,color
;1 Line x1,y1,x2,y2,color
;2 Line 10,10,20,20,3
endm
Line macro x1,y1,x2,y2,color
LOCAL else1
LOCAL else2
LOCAL else3
LOCAL while1
LOCAL while2
LOCAL next1
LOCAL next2
LOCAL continue1
LOCAL continue2
LOCAL exit
;dy = y2 - y1;
mov ax,y2
sub ax,y1
mov ddy,ax
;dx = x2 - x1;
mov ax,x2
sub ax,x1
mov ddx,ax
;if (dy < 0) { dy = -dy; stepy = -1; } else { stepy = 1; }
cmp ddy,0
jge else1
neg ddy
mov stepy,-1
jmp next1
else1: mov stepy,1
next1:
;if (dx < 0) { dx = -dx; stepx = -1; } else { stepx = 1; }
cmp ddx,0
jge else2
neg ddx
mov stepx,-1
jmp next2
else2: mov stepx,1
next2:
;dy=2*dy , dx=2*dx
mov ax,ddy
add ax,ax
mov ddy,ax
mov ax,ddx
add ax,ax
mov ddx,ax
;X=x1 , Y=y1
mov ax,x1
mov XX,ax
mov ax,y1
mov YY,ax
;putpixel(XX,YY,color)
mov cx, XX ; column
mov dx, YY ; row
mov al, color ; white
mov ah, 0ch ; put pixel
int 10h
mov ax,ddx
cmp ax,ddy
jng else3
;if(dx>dy)
;{
;fraction =2*dy-dx
mov ax,ddy
add ax,ax
sub ax,ddx
mov fraction,ax
while1: cmp XX,x2
je exit
;while (XX!=x2)
;{
cmp fraction,0
jl continue1
;Y += stepy
mov ax,YY
add ax,stepy
mov YY,ax
;fraction -= dx
mov ax,fraction
sub ax,ddx
mov fraction,ax
continue1: ;X += stepx
mov ax,XX
add ax,stepx
mov XX,ax
;fraction += dy
mov ax,fraction
add ax,ddy
mov fraction,ax
;putpixel(XX,YY,color)
mov cx, XX ; column
mov dx, YY ; row
mov al, color ; white
mov ah, 0ch ; put pixel
int 10h
jmp while1
;}
;}
else3: ;else
;{
;fraction = 2*dx-dy
mov ax,ddx
add ax,ax
sub ax,ddy
mov fraction,ax
while2: cmp YY,y2
je exit
;while (YY!=y2)
;{
cmp fraction,0
jl continue2
;XX += stepx
mov ax,XX
add ax,stepx
mov XX,ax
;fraction -= dy
mov ax,fraction
sub ax,ddy
mov fraction,ax
continue2: ;YY += stepy
mov ax,YY
add ax,stepy
mov YY,ax
;fraction += dx
mov ax,fraction
add ax,ddx
mov fraction,ax
;putpixel(XX,YY,color)
mov cx, XX ; column
mov dx, YY ; row
mov al, color ; white
mov ah, 0ch ; put pixel
int 10h
jmp while2
;}
;}
exit:
endm
stseg segment
dw 32 dup(?)
stseg ends
dtseg segment
;DIGIT1 DB 3,?,3 DUP(?)
;DIGIT2 DB 3,?,3 DUP(?)
;AMALGAR DB 2,?,2 DUP (0)
;RESULT DB '= $'
msg1 db 'hello$'
msg2 db 'x1<x2$'
;......Line......
ddx dw ?
ddy dw ?
XX dw ?
YY dw ?
stepx dw ?
stepy dw ?
fraction dw ?
dtseg ends
cdseg SEGMENT
main PROC FAR
ASSUME CS:CDSEG,SS:STSEG,DS:DTSEG
MOV AX,DTSEG
MOV DS,AX
mov ah, 0 ; set display mode function.
mov al, 13h ; mode 13h = 320x200 pixels, 256 colors.
int 10h ; set it!
Rectangle 10,10,30,30,03
lea dx,msg1
mov ah,09h
int 21h
xor al, al ; al = 0
mov cx, 10 ; column
mov dx, 20 ; row
mov ah, 0dh ; get pixel
int 10h
; pause the screen for dos compatibility:
;wait for keypress
mov ah,00
int 16h
; return to text mode:
mov ah,00 ; set display mode function.
mov al,03 ; normal text mode 3
int 10h ; set it!
main ENDP
;...........Procedure Line.........
;Line PROC
; mov cx, 10 ; column
; mov dx, 20 ; row
; mov al, 15 ; white
; mov ah, 0ch ; put pixel
; int 10h
; RET
;Line ENDP
cdseg ends
end main
همون ابتدای برنامه . وقتی خط یک فعال باشه برنامه ارور میده . اما وقتی خط 2 فعال باشه برنامه کار میکنه
خواهشا یکی کمک کنه
منتظرم .........................
من یه ماکرو نوشتم که بر اساس الگوریتم Bresenham خطی را رسم می کنه. چهارتا آرگومان دریافت می کنه و اینکار رو میکنه. حالا فقط می خوام این ماکرو رو توی ماکرو دیگه ای چهار بار صدا کنم تا چهارضلعی رسم کنه . اون ماکرو هم چهار تا آرگومان میگره . مثلا تابع Regtangle توی زبان C.
من میخوام چهارتا آرگومان تابع مستطیل رو به تابع رسم خط بفرستم . ارور میده.
اسمبلی رو تازه چند روزه که شروع کردم نمی دونم چرا نمیشه. هنوز هم انتظار دارم مثل زبان C زبان منو خوب بفهمه ولی نمی فهمه.
به جای این که محتویات آرگومان ها رو به ماکرو رسم خط بفرسته ، خودشو میفرسته (اسم خودشو)
چاره چیه؟؟؟؟؟؟
Rectangle macro x1,y1,x2,y2,color
;1 Line x1,y1,x2,y2,color
;2 Line 10,10,20,20,3
endm
Line macro x1,y1,x2,y2,color
LOCAL else1
LOCAL else2
LOCAL else3
LOCAL while1
LOCAL while2
LOCAL next1
LOCAL next2
LOCAL continue1
LOCAL continue2
LOCAL exit
;dy = y2 - y1;
mov ax,y2
sub ax,y1
mov ddy,ax
;dx = x2 - x1;
mov ax,x2
sub ax,x1
mov ddx,ax
;if (dy < 0) { dy = -dy; stepy = -1; } else { stepy = 1; }
cmp ddy,0
jge else1
neg ddy
mov stepy,-1
jmp next1
else1: mov stepy,1
next1:
;if (dx < 0) { dx = -dx; stepx = -1; } else { stepx = 1; }
cmp ddx,0
jge else2
neg ddx
mov stepx,-1
jmp next2
else2: mov stepx,1
next2:
;dy=2*dy , dx=2*dx
mov ax,ddy
add ax,ax
mov ddy,ax
mov ax,ddx
add ax,ax
mov ddx,ax
;X=x1 , Y=y1
mov ax,x1
mov XX,ax
mov ax,y1
mov YY,ax
;putpixel(XX,YY,color)
mov cx, XX ; column
mov dx, YY ; row
mov al, color ; white
mov ah, 0ch ; put pixel
int 10h
mov ax,ddx
cmp ax,ddy
jng else3
;if(dx>dy)
;{
;fraction =2*dy-dx
mov ax,ddy
add ax,ax
sub ax,ddx
mov fraction,ax
while1: cmp XX,x2
je exit
;while (XX!=x2)
;{
cmp fraction,0
jl continue1
;Y += stepy
mov ax,YY
add ax,stepy
mov YY,ax
;fraction -= dx
mov ax,fraction
sub ax,ddx
mov fraction,ax
continue1: ;X += stepx
mov ax,XX
add ax,stepx
mov XX,ax
;fraction += dy
mov ax,fraction
add ax,ddy
mov fraction,ax
;putpixel(XX,YY,color)
mov cx, XX ; column
mov dx, YY ; row
mov al, color ; white
mov ah, 0ch ; put pixel
int 10h
jmp while1
;}
;}
else3: ;else
;{
;fraction = 2*dx-dy
mov ax,ddx
add ax,ax
sub ax,ddy
mov fraction,ax
while2: cmp YY,y2
je exit
;while (YY!=y2)
;{
cmp fraction,0
jl continue2
;XX += stepx
mov ax,XX
add ax,stepx
mov XX,ax
;fraction -= dy
mov ax,fraction
sub ax,ddy
mov fraction,ax
continue2: ;YY += stepy
mov ax,YY
add ax,stepy
mov YY,ax
;fraction += dx
mov ax,fraction
add ax,ddx
mov fraction,ax
;putpixel(XX,YY,color)
mov cx, XX ; column
mov dx, YY ; row
mov al, color ; white
mov ah, 0ch ; put pixel
int 10h
jmp while2
;}
;}
exit:
endm
stseg segment
dw 32 dup(?)
stseg ends
dtseg segment
;DIGIT1 DB 3,?,3 DUP(?)
;DIGIT2 DB 3,?,3 DUP(?)
;AMALGAR DB 2,?,2 DUP (0)
;RESULT DB '= $'
msg1 db 'hello$'
msg2 db 'x1<x2$'
;......Line......
ddx dw ?
ddy dw ?
XX dw ?
YY dw ?
stepx dw ?
stepy dw ?
fraction dw ?
dtseg ends
cdseg SEGMENT
main PROC FAR
ASSUME CS:CDSEG,SS:STSEG,DS:DTSEG
MOV AX,DTSEG
MOV DS,AX
mov ah, 0 ; set display mode function.
mov al, 13h ; mode 13h = 320x200 pixels, 256 colors.
int 10h ; set it!
Rectangle 10,10,30,30,03
lea dx,msg1
mov ah,09h
int 21h
xor al, al ; al = 0
mov cx, 10 ; column
mov dx, 20 ; row
mov ah, 0dh ; get pixel
int 10h
; pause the screen for dos compatibility:
;wait for keypress
mov ah,00
int 16h
; return to text mode:
mov ah,00 ; set display mode function.
mov al,03 ; normal text mode 3
int 10h ; set it!
main ENDP
;...........Procedure Line.........
;Line PROC
; mov cx, 10 ; column
; mov dx, 20 ; row
; mov al, 15 ; white
; mov ah, 0ch ; put pixel
; int 10h
; RET
;Line ENDP
cdseg ends
end main
همون ابتدای برنامه . وقتی خط یک فعال باشه برنامه ارور میده . اما وقتی خط 2 فعال باشه برنامه کار میکنه
خواهشا یکی کمک کنه
منتظرم .........................