2017-11-02 2 views
0

나는 산술 연산을 수행하는 MASM32 프로젝트에서 일하고 있습니다. 부동 소수점 유닛을 사용하려면 코 프로세서 (8087 명령어 세트)를 사용해야합니다. 그래서 내 부동 소수점 한도는 100.0이고 모든 수는 제한보다 작아야합니다. 두 개의 숫자를 더한 다음 결과를 비교하려고 시도하지만 작동하지 않습니다.float sum을 비교하십시오.

.386 
.model flat, stdcall 
option casemap :none 
include \masm32\include\windows.inc 
include \masm32\include\kernel32.inc 
include \masm32\include\user32.inc 
includelib \masm32\lib\kernel32.lib 
includelib \masm32\lib\user32.lib 
include c:\masm32\include\masm32rt.inc 
.data 
    ;Variables de comparación. 
    FP_max DD 100 
    ;Variables volcadas de la tabla de símbolos. 
    _a DD 25 
    _b DD 80.0 
.code 
    start: 
     fild _a 
     fild _b 
     fadd 
     fcom FP_max  ;compare ST(0) with the value of the real8_var variable 
     fstsw ax   ;copy the Status Word containing the result to AX 
     sahf    ;transfer the condition codes to the CPU's flag register 
     ja overflow  ;when all flags are 0 

     jmp end_program 

     overflow: 
      print "ERROR: overflow.", 13, 10, 0 
      jmp end_program 
     end_program: 
      invoke ExitProcess, 0 
    end start 

제 질문은 : 내가 뭘 잘못하고있는 걸까요? 어떻게 해결할 수 있습니까? 감사!

+0

'fcomi'를 사용하면'fstsw ax' /'sahf'를 사용한 것처럼 플래그를 직접 설정할 수 있습니다. (내가 생각하기에 ppro, 즉 지난 20 년간의 x86이 필요합니다.) –

답변

1

fild은 정수 → FP로드입니다. fld은 부유 하중입니다. (어셈블러는 마술 적으로 레이블 다음의 첫 번째 지시어를보고 32 비트로드를 원한다고 가정합니다. 동일한 명령어는 64 비트 정수 또는 FP를로드 할 수 있습니다.)

dd은 정수 또는 부동 소수점 인코딩을 선택합니다 표현식에 소수점이 있는지 여부에 따라 (MASM 아마 당신은 fild _b를 사용


) (. Float data example using Masm을 REAL4 같은 FP의 해석을 강제 할 수있는 다른 방법이 있지만 _b는 32 비트 이진 부동 소수점 값을 보유하고 있습니다. 32 비트로 그 비트 패턴을 치료 정수

. 당신이해야 할 무엇을 의미하는지 아마 사용 _b DD 80 대신 _b DD 80.0이 아니거나 fild _b 대신 fld _b를 사용합니다.

당신은 당신 때문에 LOA, FP_max DD 100와 반대 문제가 메모리에서 fcom으로 d 그것을 REAL4으로 만드십시오.

(또는 ficom를 사용하지만, 정수와 비교하고 직접 플래그를 설정하는 ficomi 명령이 아니다 있습니다.있다 fcomi (당신이 사용해야하는) 그 수레를 비교하고 fcomp + fild 좋아하지만 필요없이 ficom있다 여분의 FP 레지스터 (fiadd과 같은 아이디어).

또한 x87 스택을 튀기려면 faddpfcomip을 사용해야하므로 언밸런스 상태로 두지 마십시오.

태그 위키의 x87 링크를 참조하십시오.

+0

하지만이 경우 1,32와 같은 숫자를 정의하려면 어떻게해야합니까? –

+0

@ TomiSebastiánJuárez. 오, 나는 당신이 보통의'fld' 대신'fild'를 사용했기 때문에 정수를 원한다고 생각했습니다. 당신은 질문에서 당신이 원하는 것을 정확히 말해야했습니다. 내 대답이 업데이트되었습니다. –