我试图在汇编中的两点 (x1,y1) 和 (x2,y2) 之间画一条线,我决定使用递归画线算法而不是 Bresenham 的。我认为这个想法很简单并编写了代码,但由于某种原因它不起作用。它根本不会在屏幕上绘制任何像素,有时会引发非法指令异常。这是代码:
line_recursive proc
pop dx ; dx = y1
pop cx ; cx = x1
pop bx ; bx = y0
pop ax ; ax = x0
cmp dx, bx ; y1==y0
jne version1
cmp ax, cx ; x1==x0
je version2
version1:
mov si,ax
add si,cx
mov di,bx
add di,dx
shr si, 1 ; si = (x1+x0)/2 = x
shr di, 1 ; di = (y1+y0)/2 = y
push ax
push cx
push dx
mov ah,0Ch ;print pixel.
mov al,12
mov cx,si
mov dx,di
int 10h
pop dx
pop cx
pop ax
; stack for call for (x0,y0, x,y)
push ax
push bx
push si
push di
; stack for call for (x1,y1, x,y)
push cx
push dx
push si
push di
call line_recursive ; (x1,y1, x,y)
call line_recursive ; (x0,y0, x,y)
version2:
ret
line_recursive endp
在将几个数字推送到 dx、cx、bx 和 ax 后,我尝试在程序中调用它。它根本什么也没画,我看不出为什么?我知道我使用的像素打印速度很慢,但这对我目前的学习来说很好。我对汇编中递归的想法是完全错误的,还是有其他原因导致此代码不起作用?