2011-08-25 23 views
5

Tôi đã được giao nhiệm vụ viết một ứng dụng đơn giản trong hỗn hợp C/ASM mà phải sử dụng bộ xử lý toán học.x87 FPOP và FCOM hướng dẫn - cách thức hoạt động?

Có hình trụ chức năng (float x, float y, float z) trả về 1 nếu điểm đã cho nằm trong hình trụ (hình trụ có base tại x = 0, y = 0, radius = 5 và height = 10) và 0 nếu không.

Vì vậy, có vẻ đơn giản. Kiểm tra xem z có nằm trong phạm vi < 0,10> và sau đó kiểm tra xem x^2 + y^2 < 25.

Nhưng kiến ​​thức của tôi về x87 là không.

Có mọi thứ tôi đã viết.

_cylinder PROC 

push ebp 
mov ebp, esp 
sub esp,8 ; I can't use .data in the application, so I reserve some space on the stack for numbers 10 and 25 
mov [esp],10 
mov [esp+4],25 

finit 
fldz 
fld [ebp+8] 

    ;here i get stuck 

add esp, 8 
pop ebp 
_cylinder ENDP 

Vì vậy, tôi gặp khó khăn. Vì vậy, tôi cố gắng tìm hướng dẫn nào tôi có thể sử dụng trong ứng dụng. Và ở đó tôi gặp khó khăn, bởi vì mỗi danh sách hướng dẫn/hướng dẫn tôi tìm thấy trên mạng được viết rất tệ nên tôi hầu như không thể hiểu được bất cứ điều gì.

Câu hỏi đặt ra là, điều gì sẽ xảy ra khi tôi bật thứ gì đó từ bộ xử lý toán học? Tôi có thể tìm thấy giá trị xuất hiện ở đâu? Nó làm thế nào để chuyển đổi từ giá trị 80 bit thành 32 bit (nếu có), dĩ nhiên là Câu hỏi khác là, FCOM (FCOMP cho biến thể pop) hoạt động như thế nào? Nó so sánh những gì để những gì (st0 đến st1 hoặc st1 để st0?), Và nơi tôi có thể xem liệu giá trị nhỏ hơn/bằng/lớn hơn?

Cảm ơn bạn đã trợ giúp!

+5

Trước khi bạn nhận được quá sâu, hãy xem xét việc sử dụng SSE2 toán thay vì x87. Nó dễ dàng hơn nhiều để làm việc với (bạn có thể sử dụng thanh ghi thay vì một chồng), có nhiều chức năng hơn, và nói chung là nhanh hơn. – duskwuff

+0

Duskwuff nói gì. 'x87' có hiệu quả không được chấp nhận và có rất ít lý do để phần mềm mới nhắm mục tiêu nó. –

+0

@Stephen - "không được chấp nhận" bởi một số hệ điều hành, không phải CPU, nhà cung cấp (nhưng ngay cả ở đó, vẫn được hỗ trợ). Lý do sử dụng: ví dụ: độ chính xác mở rộng 80 bit và các hàm toán siêu việt. – PhiS

Trả lời

5

So sánh điểm nổi là loại đau. Bạn có thể so sánh trên FPU, nhưng trước khi bạn có thể làm bất cứ điều gì dựa trên đó, bạn phải chuyển từ trạng thái dấu chấm động sang CPU, kiểm tra cờ bạn quan tâm và sau đó phản ứng dựa trên đó.

Chỉ cần ví dụ, so sánh ban đầu của bạn mà z> = 0.0 sẽ giống như thế này:

fldz 
fcomp z 
fnstsw ax 
test ah, 041h; I *think* I've got the right flags there... 
jp good 
+4

Hmm, không phải là 'kiểm tra ah, ...'? [Tham khảo] (http://webster.cs.ucr.edu/AoA/Windows/HTML/RealArithmetic.html#1000117). Cá nhân tôi tìm thấy bằng cách sử dụng ['FCOMI'] (http://stackoverflow.com/questions/7057501/x86-assembler-floating-point-compare/7057771#7057771) dễ dàng hơn so với rối tung với bitmask cho từ trạng thái, nó chỉ có sẵn trên P6 +. – user786653

+3

@ user786653: oops - vâng, nó phải là ah, không phải rìu. Lời xin lỗi của tôi.Có, FCOMI là tốt đẹp, nhưng do thời gian P6 đến cùng, tôi đã không viết gần như nhiều mã lắp ráp. Nếu tôi đang viết cho các bộ vi xử lý mới hơn, tôi có thể sử dụng SSE để thay thế. –

+2

Tôi đồng ý, nếu tôi * có * để viết nó trong trình biên dịch x86. Có vẻ như OP được thiết lập trên bằng cách sử dụng x87 mặc dù, vì vậy tôi figured tôi muốn thông qua nó ra khỏi đó. Tôi cũng dường như mơ hồ nhớ lại 'sahf' + unsigned tests (như với' fcomi') làm việc. – user786653

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