x87 รหัสเครื่อง 11 ไบต์
D9 EB
DA 31
D9 F2
DD D8
DA 09
C3
ไบต์ของโค้ดด้านบนจะกำหนดฟังก์ชั่นที่คำนวณพื้นที่ของ n-gon ปกติด้วย apothem ที่ 1 โดยใช้คำสั่ง x87 FPU (หน่วยจุดลอยตัวแบบคลาสสิกบนโปรเซสเซอร์ x86) เพื่อทำการคำนวณนี้
หลังจากการเรียกใช้การลงทะเบียนแบบ x86 มาตรฐาน (ในกรณีนี้__fastcall
) อาร์กิวเมนต์ของฟังก์ชันคือตัวชี้ไปยังจำนวนเต็มที่ส่งผ่านในการECX
ลงทะเบียน ผลลัพธ์ของฟังก์ชันคือค่าเลขทศนิยมซึ่งส่งคืนที่ด้านบนของ x87 จุดลอยตัวสแต็ก (รีจิสเตอร์ST0
)
ลองออนไลน์!
คำย่อของชุดประกอบ Ungolfed:
D9 EB fldpi ; load constant PI at top of FPU stack
DA 31 fidiv DWORD PTR [ecx] ; divide PI by integer input (loaded from pointer
; in ECX), leaving result at top of FPU stack
D9 F2 fptan ; compute tangent of value at top of FPU stack
DD D8 fstp st0 ; pop junk value (FPTAN pushes 1.0 onto stack)
DA 09 fimul DWORD PTR [ecx] ; multiply by integer input (again, loaded via ECX)
C3 ret ; return control to caller
อย่างที่คุณเห็นนี่เป็นเพียงการคำนวณสูตรที่ตรงไปตรง
มา result = n * tan (π / n)
มีเพียงสิ่งที่น่าสนใจสองสามข้อที่ชี้ให้เห็น:
- x87 FPU มีคำแนะนำเฉพาะสำหรับการโหลดค่าคงที่ PI (
FLDPI
) สิ่งนี้ไม่ค่อยได้ใช้แม้แต่วัน (และตอนนี้ก็ชัดเจนน้อยกว่า) แต่ก็มีขนาดที่สั้นกว่าการฝังค่าคงที่ลงในไบนารีของคุณแล้วโหลดมัน
- คำสั่ง x87 FPU เพื่อคำนวณแทนเจนต์,
FPTAN
แทนที่ค่าของอินพุตรีจิสเตอร์ (ด้านบนของ FPU สแต็ก) ด้วยผลลัพธ์ แต่ยังเพิ่มค่าคงที่ 1.0 ลงด้านบนของ FPU สแต็ก สิ่งนี้ทำเพื่อความเข้ากันได้ย้อนหลังกับ 8087 (ฉันไม่รู้ว่าทำไมสิ่งนี้ถึงเกิดขึ้นใน 8087 อาจเป็นข้อผิดพลาด) นั่นหมายความว่าเราจำเป็นต้องแสดงค่าที่ไม่จำเป็นนี้ออกจากสแต็ก วิธีที่เร็วและสั้นที่สุดในการทำเช่นนั้นเป็นเรื่องง่ายFSTP st0
เหมือนที่เราใช้ที่นี่ เราสามารถทำทวีคูณและป๊อปได้เนื่องจากการคูณด้วย 1.0 จะไม่เปลี่ยนผลลัพธ์ แต่นี่ก็เป็น 2 ไบต์ (ดังนั้นจึงไม่ชนะขนาดรหัส) อาจทำงานช้ากว่าและอาจแนะนำการกำหนดที่ไม่จำเป็นเข้ามา ผลลัพธ์.
แม้ว่าโปรแกรมเมอร์หรือคอมไพเลอร์สมัยใหม่จะใช้ชุดคำสั่ง SSE (และรุ่นที่ใหม่กว่า) แทนที่จะเป็นชุดอายุ x87 แต่จะต้องใช้รหัสเพิ่มเติมในการติดตั้งเนื่องจากไม่มีคำสั่งเดียวในการคำนวณแทนเจนต์ใน ISAs ที่ใหม่กว่านี้
Area@RegularPolygon
ควรจะArea@*RegularPolygon
; เนื่องจากตอนนี้มันไม่สามารถจับภาพในตัวแปรได้ นั่นคือf = Area@RegularPolygon; f[3]
ไม่ทำงาน การสนทนาเมตาที่เกี่ยวข้อง