gpt4 book ai didi

assembly - x86汇编语言中点圆算法

转载 作者:行者123 更新时间:2023-12-03 21:29:23 25 4
gpt4 key购买 nike

我一直在尝试使用 x86 汇编程序使用中点圆算法绘制一个圆,我已经非常接近(我认为),我关注了另一个与此非常相似的问题:

Drawing a circle using 8086 Assembly Language

这有助于解决我遇到的其他问题。然而,我不是很圆,我有基本的形状,但它似乎是凹的。

[x86 circle ] 1

我试图复制维基上的 C 代码示例,如下所示:

C:

void drawcircle(int x0, int y0, int radius)
{
int x = radius;
int y = 0;
int err = 0;

while (x >= y)
{
putpixel(x0 + x, y0 + y);
putpixel(x0 + y, y0 + x);
putpixel(x0 - y, y0 + x);
putpixel(x0 - x, y0 + y);
putpixel(x0 - x, y0 - y);
putpixel(x0 - y, y0 - x);
putpixel(x0 + y, y0 - x);
putpixel(x0 + x, y0 - y);

y += 1;
err += 1 + 2*y;
if (2*(err-x) + 1 > 0)
{
x -= 1;
err += 1 - 2*x;
}
}
}

ASM:
DSEG    SEGMENT PARA PUBLIC 'DATA'         
Y DW 0
X DW 0
Y_C DW 0
X_C DW 0
E DW 0
DSEG ENDS

CSEG SEGMENT PARA PUBLIC 'CODE'
ASSUME CS:CSEG, DS:DSEG, SS:SSEG

MAIN PROC FAR

PUSH DS
MOV AX,0
PUSH AX
MOV AX,DSEG
MOV DS,AX


;The program begins here.
MOV AH,00H ;Video: 640x480
MOV AL,18
INT 10H

MOV DX,240
MOV CX,320
MOV SI,100
MOV AL,3
CALL CIRCLE


MOV AH,00H
INT 16H

MOV AH,00H
MOV AL,2 ;Reset the screen to normal
INT 10H


RET ;The program ends here.

MAIN ENDP
;--------------------------------------------------------------
; CIRCLE
; Description: Draws a circle
; Input param: DX = CENTER (X)
; CX = CENTER (Y)
; AL = Colour
; SI = radius
; Reg Effected: None
;--------------------------------------------------------------
CIRCLE PROC
PUSH DX
PUSH CX

MOV X,SI
MOV X_C,DX
MOV Y_C,CX

CIR:
MOV DX,X
CMP DX,Y
JNGE FIN_CIR

CALL DRAWCIRCLE

INC Y

PUSH AX

MOV AX,2
MUL Y
INC AX
ADD AX,E
ADD E,AX

SUB AX,X
MOV DX,2
MUL DX
INC AX
CMP AX,0
JG E_CHECK

POP AX
JMP CIR

E_CHECK:
DEC X
MOV AX,X
MUL DX
MOV DX,1
SUB DX,AX
ADD E,DX

POP AX
JMP CIR

FIN_CIR:
POP CX
POP DX
RET
CIRCLE ENDP

;-------------------------------------------------------------
; DRAWCIRCLE
; Description: Draws a circle, using midpoint circle algorithm
; Input params: DX = Row (X)
; CX = Column (Y)
; AL = Colour
; SI = radius
; Reg Effected: None
;--------------------------------------------------------------

DRAWCIRCLE PROC
PUSH DX
PUSH CX

MOV DX,X_C
MOV CX,Y_C
ADD DX,X
ADD CX,Y
CALL WRITEPIXEL

MOV DX,X_C
MOV CX,Y_C
ADD DX,Y
ADD CX,X
CALL WRITEPIXEL

MOV DX,X_C
SUB DX,Y
CALL WRITEPIXEL

MOV DX,X_C
MOV CX,Y_C
SUB DX,X
ADD CX,Y
CALL WRITEPIXEL

MOV CX,Y_C
SUB CX,Y
CALL WRITEPIXEL

MOV DX,X_C
MOV CX,Y_C
SUB DX,Y
SUB CX,X
CALL WRITEPIXEL

MOV DX,X_C
ADD DX,Y
CALL WRITEPIXEL

MOV DX,X_C
MOV CX,Y_C
ADD DX,X
SUB CX,Y
CALL WRITEPIXEL

POP CX
POP DX
RET
DRAWCIRCLE ENDP

也许我完全错了,有人可以帮助我吗?

最佳答案

以下几行似乎不等于 C 代码:

MOV     AX,2
MUL Y
INC AX
ADD AX,E <- After this AX = err+2*y+1
ADD E,AX <- Now you do: err += err+2*y+1

您必须更换 ADD E,AX来自 MOV E,AX .

下一个错误是这个:
    ...
MOV DX,2
MUL DX <- This instruction "destroys" DX!
...
E_CHECK:
DEC X
MOV AX,X
MUL DX <- DX is no longer 2 here

您必须插入 MOV DX,2之前 MUL DX .

我做了两个修改,现在程序似乎画了一个圆圈。

顺便一提:

通过执行 ADD AX,AX 可以更有效地完成乘以 2 .

关于assembly - x86汇编语言中点圆算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40695745/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com