2011-01-23 3 views
8

최근에 FPU 스택 오버 플로우 문제가 발생했습니다. 필자는 불필요한 라이브러리 함수를 추적하여 그 불필요한 값을 FPU 스택에 푸시 (push)하여 매번 호출하고 결코 정리하지 못하게합니다.FPU 스택에서 무언가를 제거하는 가장 간단한 방법

다행히도 이것은 쉽게 재현 할 수 있으며 어떤 조건으로 인해 발생하는지 정확하게 알고 있습니다. FPU 스택에서 최상위 값을 다시 팝하는 루틴을 호출하는 루틴에 인라인 ASM 블록을 드롭 할 수 있습니다. 필자는 작성할 내용을 모르는 경우를 제외하고는. 내 ASM-fu는 middlin에게는 공평하지만 이 아닙니다.

그렇다면 가비지 데이터를 가정하고 값을 신경 쓰지 않는다고 가정하면 x86 어셈블리의 FPU 스택에서 가장 높은 값을 제거하는 가장 간단한 방법은 무엇입니까?

답변

5

스택을 어느 정도 조정해야하는지 알고 있다면 fincstp을 사용할 수 있습니다. 또한 증가하는 레지스터를 ffree으로 지정하려고합니다.

그러나 가장 간단한 해결책은 fstp과 같은 터지는 데이터 전송 작업 중 하나를 사용하는 것입니다. 일반적으로 나중에 사용하기 위해 메모리 영역, 같은에 결과를 저장하는 것입니다 : 방금 값을 버리고 싶어 알고있는 경우,

mem_area: defs 10   ; ten bytes for 80 bits 
      fstp mem_area ; pop it 

그러나, 당신은 절약 대상으로 st(0) 자체를 사용할 수 있습니다 메모리 요구 사항 :

fstp st(0) 

이 지침 (특히 this bit)에 대한 자세한 안내는 here를 참조하십시오.

+0

오른쪽 당신은, @Shaggieh, 내 뚱뚱한 손가락을 마셔. 결정된. – paxdiablo

+0

그게 효과가 있어요. 감사! –

+0

@Shaggieh : 그렇습니다.하지만 똑같은 대답으로 두 번 오류가 발생하는 것은 부주의합니다 .-- 다시 한번 고정되어 있습니다. 건배. – paxdiablo

0

그냥 튀어 나오는 (빠른) 명령으로 스택에서 꺼내십시오. 8087 instruction set

그래도 작동하지 않으면 FUCOMPP가 두 번 나타납니다. 그것은 당신이 원하는 경우에만 정상 값이 없애 있다면

2

: 한 번 FPU 스택을 팝업하는

델파이/BASM를 들어
ffree st0 
13

, 내보기에 가장 간단한 방법입니다 :

asm 
fstp st(0) 
end; 
+4

이것은 실제로 정답입니다. 대부분의 x87 구현은이 경우 최적화되어 전송을 수행하지 않고 스택에서 값을 팝합니다. – IneQuation

관련 문제