我必须计算定义多边形的区域,其中点(x,y)存储在堆栈中,但我无法弄清楚为什么代码不起作用,你能帮助我吗? 这个过程是关于计算所有这些点的[(x-xo)(y + yo)] /。
在这段代码中我正在尝试一个简单的多边形(区域= 1)并且还没有除以2,因为总和并不总是有效,我真的不知道出了什么问题。最后它应该给我(-2),但我似乎没有真正得到这个。
Soma = the final result
ContPt = number of points (x,y)
temp = just temporary variables
mov soma, 0
mov ax, 0
push ax
mov ax, 0
push ax
mov ax, 0
push ax
mov ax, 1
push ax
mov ax, 1
push ax
mov ax, 1
push ax
mov ax, 1
push ax
mov ax, 0
push ax
pop ax
mov temp2, ax
pop ax
mov temp1, ax
pop ax
mov temp4, ax
add ax, temp2
pop bx
mov temp3, bx
sub bx, temp1
mul bx
add soma, ax
mov cx, ContPt
sub cx, '2'
Lp: mov dx, temp4
pop ax
mov temp4, ax
add ax, dx
mov dx, temp3
pop bx
mov temp3, bx
sub bx, dx
mul bx
add soma, ax
loop Lp
mov ax, temp2
mov dx, temp4
add ax, dx
mov bx, temp1
mov dx, temp3
sub bx, dx
mul bx
add soma, ax
答案 0 :(得分:1)
你远离正确的,更不用说一个好的计划了。首先,你的论坛中没有任何内容可以说明有多少分。其次,您应该在HLL中进行编码,然后使用HLL进行翻译以进行注释。第三,您需要了解有关寻址模式的更多信息,并使用bp
寄存器直接访问堆栈中的项目,而不是将它们从内存中弹出并将它们放回其他内存位置。
多边形区域的HLL类似于:
int n = 4; // number of points
int sum = 0;
for (int q = n - 1, p = 0; p < n; q = p++)
sum += pts[q].x * pts[p].y - pts[p].x * pts[q].y;
return sum / 2;
现在布局堆栈。假设您已按此顺序推送参数:pts[0].x, pts[0].y, pts[1]x, pts[1].y, ... , pts[n-1].x, pts[n-1].y, n
。那你有
sp-2*n-4 -> pts[0].x
sp-2*n-2 -> pts[0].y
...
sp-4 -> pts[n-1].x
sp-2 -> pts[n-1].y
sp -> n
因此我们可以通过设置bp = sp - 2 * n - 4
来访问像数组一样的点 mov bp, sp
mov cx, [bp] ; cx = n, loop counter
mov si, cx ; si = n
shl si, 1 ; si = 2 * n
neg si ; si = -2 * n
lea bp, [bp+si-4] ; bp = sp - 2*n - 4
mov di, 0 ; di = p * 4 = 0, location of first point wrt bp
neg si ; si = 2 * n
shl si, 1 ; si = 4 * n
sub si, 4 ; si = q * 4 = (n-1) * 4, location of last point wrt bp
xor dx, dx ; dx = sum = 0
jcxz done ; Skip loop if counter is zero
next:
mov ax, [bp+si] ; ax = pts[q].x
imul [bp+di+2] ; ax *= pts[p].y
add dx, ax ; sum += pts[q].x * pts[p].y
mov ax, [bp+di] ; ax = pts[p].x
imul [bp+si+2] ; ax *= pts[q].y
sub dx, ax ; sum -= pts[p].x * pts[q].y
mov si, di ; advance q
add di, 4 ; advance p
loop next ; keep going until cx is zero
done:
asr dx, 1 ; sum /= 2
; Here dx holds answer
我无法测试这个。我25年没有使用8086汇编语言了,但它应该很接近。