x86, 41 39 ไบต์
การนำไปใช้ส่วนใหญ่ของสูตรตรงไปตรงมากับอินพุตecx
และเอาต์พุตบนสแต็ก
สิ่งที่น่าสนใจก็คือว่าผมใช้ฟังก์ชั่น cubing แต่ตั้งแต่call label
ไบต์ 5ผมเก็บที่อยู่ของฉลากและใช้ 2 call reg
ไบต์ นอกจากนี้ตั้งแต่ฉันดันค่าในฟังก์ชั่นของฉันฉันใช้แทนjmp
ret
เป็นไปได้อย่างมากว่าการใช้ลูปอย่างชาญฉลาดและสแต็กสามารถหลีกเลี่ยงการโทรได้ทั้งหมด
ฉันไม่ได้ทำแฟนซีเทคนิคใด ๆ กับ cubing (k+1)^3 = k^3 + 3k^2 + 3k + 1
เช่นการใช้
การเปลี่ยนแปลง:
.section .text
.globl main
main:
mov $10, %ecx # n = 10
start:
lea (cube),%edi # save function pointer
call *%edi # output n^3
sub %ecx, %eax # n^3 - n
# edx = 0 from cube
push $6
pop %ebx # const 6
idiv %ebx # k = (n^3 - n)/6
mov %eax, %ecx # save k
call *%edi # output k^3
push %eax # output k^3
not %ecx # -k-1
call *%edi # output (-k-1)^3
inc %ecx
inc %ecx # -k+1
call *%edi # output (-k+1)^3
ret
cube: # eax = ecx^3
pop %esi
mov %ecx, %eax
imul %ecx
imul %ecx
push %eax # output cube
jmp *%esi # ret
objdump:
00000005 <start>:
5: 8d 3d 22 00 00 00 lea 0x22,%edi
b: ff d7 call *%edi
d: 29 c8 sub %ecx,%eax
f: 6a 06 push $0x6
11: 5b pop %ebx
12: f7 fb idiv %ebx
14: 89 c1 mov %eax,%ecx
16: ff d7 call *%edi
18: 50 push %eax
19: f7 d1 not %ecx
1b: ff d7 call *%edi
1d: 41 inc %ecx
1e: 41 inc %ecx
1f: ff d7 call *%edi
21: c3 ret
00000022 <cube>:
22: 5e pop %esi
23: 89 c8 mov %ecx,%eax
25: f7 e9 imul %ecx
27: f7 e9 imul %ecx
29: 50 push %eax
2a: ff e6 jmp *%esi
นี่คือเวอร์ชั่นทดสอบของฉันที่จะทำการลูกบาศก์ทั้งหมดในตอนท้าย หลังจากค่าถูกส่งบนสแต็กคิวบ์วนเขียนทับค่าสแต็ก ปัจจุบันคือ42 40 ไบต์ แต่ควรมีการปรับปรุงบางอย่าง
.section .text
.globl main
main:
mov $10, %ecx # n = 10
start:
push %ecx # output n
mov %ecx, %eax
imul %ecx
imul %ecx
sub %ecx, %eax # n^3 - n
# edx = 0 from imul
push $6
pop %ecx # const 6
idiv %ecx # k = (n^3 - n)/6
push %eax # output k
push %eax # output k
not %eax # -k-1
push %eax # output -k-1
inc %eax
inc %eax # -k+1
push %eax # output -k+1
dec %ecx # count = 5
add $20, %esp
cube:
mov -4(%esp),%ebx # load num from stack
mov %ebx, %eax
imul %ebx
imul %ebx # cube
push %eax # output cube
loop cube # --count; while (count)
ret
-10
วิธีแก้ปัญหาที่เป็นไปได้อื่นอาจเป็น-1000+4574296+4410944-4492125-4492125
ตัวอย่าง และอนุญาตให้ส่งออก--
หรือ+-
แทน+
/-
ตามลำดับ (เช่น3 = 27+-27+-125--64--64
แทนที่จะเป็น3 = 27-27-135+64+64
) หรือไม่