8086汇编的问题

时间:2014-06-25 02:06:49

标签: assembly intel x86-16

我必须计算定义多边形的区域,其中点(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

1 个答案:

答案 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汇编语言了,但它应该很接近。