Assembly TASM数学协处理器FSUB不减法
我在使用数学协处理器时遇到困难。我需要用Heron公式计算三角形的面积(s=sqrt(p(p-a)(p-b)(p-c)),其中p是半周长,a,b和c是三角形的边)。我成功地读取了a,b,c并计算了p,但我在从p中减去a,b和c时遇到了问题。 我的代码:Assembly TASM数学协处理器FSUB不减法,assembly,tasm,x87,Assembly,Tasm,X87,我在使用数学协处理器时遇到困难。我需要用Heron公式计算三角形的面积(s=sqrt(p(p-a)(p-b)(p-c)),其中p是半周长,a,b和c是三角形的边)。我成功地读取了a,b,c并计算了p,但我在从p中减去a,b和c时遇到了问题。 我的代码: FSUB适用于浮点数。如果您有一个整数,可能需要FISUB。还要确保使用正确的操作数大小。此外,特别是如果您希望他人帮助,请注释您的代码。而且,像往常一样,学习使用调试器和指令集引用。@Jester是的,显然它可以与FISUB一起使用,但为什么呢
FSUB
适用于浮点数。如果您有一个整数,可能需要FISUB
。还要确保使用正确的操作数大小。此外,特别是如果您希望他人帮助,请注释您的代码。而且,像往常一样,学习使用调试器和指令集引用。@Jester是的,显然它可以与FISUB
一起使用,但为什么呢?我进入了3,4,5区,给了我6区,很公平。但我也输入了3,4,6,它给了我5.3326,所以它也适用于浮点数。几乎没有一条浮点数指令是正确的。它们将内存操作数解释为32位单精度浮点数,而不是提供的32位整数。
DATA SEGMENT PARA PUBLIC 'DATA'
A DD 0
B DD 0
C DD 0
P DD 0
PA DD 0 ; P-A
PB DD 0 ;P-B
PC DD 0 ;P-C
AREA DD 0
TWO DD 2
AUX DD 0
DATA ENDS
READ MACRO X, AUX ; THE READING MACRO FOR A, B AND C. THIS GOES FINE
LOCAL R, FINAL
PUSH EAX
PUSH EBX
PUSH EDX
MOV X, 0
MOV EBX, 10
R:
MOV AH, 1H
INT 21H
CMP AL, 0DH
JE FINAL
CMP AL,30H
JB R
CMP AL, 39H
JA R
SUB AL, 48
XOR AH,AH
MOV AUX,EAX
MOV EAX, X
MUL EBX
ADD EAX, AUX
MOV X, EAX
JMP R
FINAL:
POP EDX
POP EBX
POP EAX
ENDM
CODE SEGMENT PARA PUBLIC 'CODE'
.386
START PROC FAR
ASSUME CS:CODE, DS:DATA
PUSH DS
XOR AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
READ A, AUX
READ B, AUX
READ C, AUX
FINIT
FLD A
FADD B
FADD C
FDIV TWO
FSTP P ;P IS COMPUTED
FLD P
FSUB A ; HERE IS MY PROBLEM. IT SEEMS IT DOESN'T SUBTRACT A
FSTP PA
FLD P
FSUB B ; ALSO, THE SAME PROBLEM HERE
FSTP PB
FLD P
FSUB C ;ALSO, THE SAME PROBLEM HERE
FSTP PC
FLD P
FMUL PA
FMUL PB
FMUL PC
FSQRT
FSTP AREA
FWAIT
RET
START ENDP
CODE ENDS
END START