2011-01-23 26 views
8

Tôi đã gặp một số sự cố gần đây với tràn ngăn FPU. Tôi quản lý để theo dõi nó trở lại một chức năng thư viện buggy đẩy một giá trị rác vào ngăn xếp FPU mỗi khi nó được gọi là và không bao giờ làm sạch nó lên.Cách đơn giản nhất để xóa nội dung nào đó khỏi ngăn xếp FPU

May mắn thay, điều này dễ tái sản xuất và tôi biết chính xác điều kiện nào gây ra. Tôi có thể thả một khối ASM nội tuyến vào thường trình gọi các thói quen này để bật giá trị hàng đầu trở lại ngăn xếp FPU ... ngoại trừ tôi không hoàn toàn biết phải viết gì. ASM-fu của tôi công bằng với middlin ', nhưng không phải là rằng mạnh mẽ. Vì vậy, cách đơn giản nhất để loại bỏ giá trị hàng đầu trên ngăn xếp FPU trong lắp ráp x86 là gì, giả sử đó là dữ liệu rác và tôi không quan tâm đến giá trị?

Trả lời

5

Nếu bạn biết mình cần điều chỉnh bao nhiêu, bạn có thể sử dụng fincstp. Bạn cũng muốn ffree các thanh ghi mà bạn đã tăng lên.

Tuy nhiên, có lẽ giải pháp đơn giản nhất là sử dụng một trong các hoạt động chuyển dữ liệu popping như fstp. Thông thường bạn sẽ lưu trữ kết quả vào một khu vực của bộ nhớ để sử dụng sau, một cái gì đó như:

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

Nhưng, nếu bạn biết bạn chỉ muốn vứt bỏ các giá trị, bạn có thể sử dụng st(0) chính nó như là đích, tiết kiệm yêu cầu bộ nhớ:

fstp st(0) 

Xem here cho một hướng dẫn chi tiết về các hướng dẫn (đặc biệt là this bit).

+0

Ngay bạn, @Shaggieh, darn những ngón tay béo của tôi. Đã sửa. – paxdiablo

+0

Điều đó đã hiệu quả. Cảm ơn! –

+0

@Shaggieh: có, nhưng để err hai lần trong cùng một câu trả lời chỉ là bất cẩn :-) Cố định một lần nữa. Chúc mừng. – paxdiablo

0

chỉ cần bật nó ra khỏi ngăn xếp với bất kỳ lệnh (nhanh) nào xuất hiện. 8087 instruction set

nếu điều đó không hiệu quả, FUCOMPP sẽ bật hai lần.

2

Nếu nó chỉ có giá trị hàng đầu mà bạn muốn để thoát khỏi:

ffree st0 
13

Đối với Delphi/BASM, theo quan điểm của tôi cách đơn giản nhất để bật FPU chồng một lần là:

asm 
fstp st(0) 
end; 
+4

Đây thực sự là câu trả lời đúng. Hầu hết các triển khai x87 được tối ưu hóa để đánh dấu trường hợp này và thậm chí sẽ không thực hiện việc truyền tải, chỉ cần bật giá trị ra khỏi ngăn xếp. – IneQuation

Các vấn đề liên quan