ورود

View Full Version : سوال: مشکل با پارامترهای ماکرو



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 فعال باشه برنامه کار میکنه
خواهشا یکی کمک کنه
منتظرم .........................

tdkhakpur
دوشنبه 25 آبان 1388, 19:43 عصر
كد هاي موجود در داخل ماكروهاي شما بيشتر از حدي اشت كه بتوان پرش كوتاه كرد لذا پرش بلند بايد انجام بديد.



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 far ptr else1
neg ddy
mov stepy,-1
jmp far ptr next1
else1: mov stepy,1
next1:
;if (dx < 0) { dx = -dx; stepx = -1; } else { stepx = 1; }
cmp ddx,0
jge far ptr else2
neg ddx
mov stepx,-1
jmp far ptr 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 far ptr 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 far ptr exit
;while (XX!=x2)
;{
cmp fraction,0
jl far ptr 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 far ptr while1
;}
;}
else3: ;else
;{
;fraction = 2*dx-dy
mov ax,ddx
add ax,ax
sub ax,ddy
mov fraction,ax
while2: cmp YY,y2
je far ptr exit
;while (YY!=y2)
;{
cmp fraction,0
jl far ptr 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 far ptr while2
;}
;}
exit:
endm
Rectangle macro x1,y1,x2,y2,color
Line x1,y1,x2,y2,color
Line 10,10,20,20,3
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

sjhosseini
دوشنبه 25 آبان 1388, 22:33 عصر
با سلام
ممنون از پاسخ شما
من این برنامه رو با emu8086 نوشتم. ولی با توجه به تغییراتی که دادید بازهم ارور میده.
با masm هم کامپایل کردم اما exe اجرا نمیشه. فکر کنم از بابت مد گرافیکش باشه.
شما تونستید برنامه رو اجرا بگیرید؟؟
اگر تونستید لطف کنید بفرمائید با چی و چه جوری؟؟؟

tdkhakpur
دوشنبه 25 آبان 1388, 23:02 عصر
اين هم تنظيم شده براي emu



Line macro x1,y1,x2,y2,color
LOCAL else1, jmp1, jmp2, jmp3
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 far ptr 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 far ptr 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

mov ax, xx
while1: cmp ax, word ptr x2
jne jmp1
jmp far ptr exit
jmp1:

;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 far ptr while1
;}
;}
else3: ;else
;{
;fraction = 2*dx-dy
mov ax,ddx
add ax,ax
sub ax,ddy
mov fraction,ax

mov ax, YY
while2: cmp ax,y2
jne jmp2
jmp far ptr exit
jmp2:
;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 far ptr while2
;}
;}
exit:
endm
Rectangle macro x1,y1,x2,y2,color
Line x1,y1,x2,y2,color
Line 10,10,20,20,3
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 ?

x1 dw 10
y1 dw 10
x2 dw 30
y2 dw 30
color db 3

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 x1, y1,x2,y2,color
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

sjhosseini
سه شنبه 26 آبان 1388, 00:16 صبح
خیلی خیلی ممنون از راهنمایی شما
اینم تمام شده کار

Line macro x1,y1,x2,y2,color
LOCAL else1, jmp1, jmp2
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 far ptr 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 far ptr 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: mov ax, XX
cmp ax, word ptr x2
;je far ptr exit
jne jmp1
jmp far ptr exit
jmp1:

;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 far ptr while1
;}
;}
else3: ;else
;{
;fraction = 2*dx-dy
mov ax,ddx
add ax,ax
sub ax,ddy
mov fraction,ax

while2: mov ax, YY
cmp ax,word ptr y2
;je far ptr exit
jne jmp2
jmp far ptr exit
jmp2:
;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 far ptr while2
;}
;}
exit:
endm

Rectangle macro x1,y1,x2,y2,color

Line x1,y1,x2,y1,color
Line x2,y1,x2,y2,color
Line x2,y2,x1,y2,color
Line x1,y2,x1,y1,color
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 'Finish$'
msg2 db 'x1<x2$'

;......Line......
ddx dw ?
ddy dw ?
XX dw ?
YY dw ?
stepx dw ?
stepy dw ?
fraction dw ?

x1 dw 10
y1 dw 10
x2 dw 30
y2 dw 30
color db 3

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 x1,y1,x2,y2,color
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