Last active
August 21, 2020 03:11
-
-
Save marethyu/a79306ffc339452f2a760bf3548e8ebe to your computer and use it in GitHub Desktop.
x64 Assembly program to print factorials between one to infinity.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| ; $ nasm -f elf64 factorial.asm && gcc -m64 -no-pie -o factorial factorial.o && ./factorial | |
| bits 64 | |
| global main | |
| extern putchar, getchar, exit | |
| section .text | |
| main: | |
| push rbp | |
| xor rbx, rbx | |
| add rbx, 1 | |
| add byte[block + rbx], 10 | |
| add rbx, 3 | |
| add byte[block + rbx], 1 | |
| add rbx, 1 | |
| add byte[block + rbx], 1 | |
| jmp label2 | |
| label1: | |
| add rbx, 3 | |
| add byte[block + rbx], 1 | |
| jmp label4 | |
| label3: | |
| sub byte[block + rbx], 1 | |
| jmp label6 | |
| label5: | |
| sub rbx, 5 | |
| jmp label8 | |
| label7: | |
| add byte[block + rbx], 1 | |
| sub rbx, 5 | |
| label8: | |
| cmp byte[block + rbx], 0 | |
| jnz label7 | |
| add rbx, 2 | |
| jmp label10 | |
| label9: | |
| mov byte[block + rbx], 0 | |
| add rbx, 1 | |
| mov al, byte[block + rbx] | |
| add byte[block + rbx + -2], al | |
| mov al, byte[block + rbx] | |
| add byte[block + rbx + -1], al | |
| mov byte[block + rbx], 0 | |
| sub rbx, 1 | |
| mov al, byte[block + rbx] | |
| add byte[block + rbx + 1], al | |
| mov byte[block + rbx], 0 | |
| sub rbx, 1 | |
| jmp label12 | |
| label11: | |
| add rbx, 1 | |
| add byte[block + rbx], 1 | |
| sub rbx, 1 | |
| sub byte[block + rbx], 1 | |
| jmp label14 | |
| label13: | |
| add rbx, 1 | |
| add byte[block + rbx], 1 | |
| sub rbx, 1 | |
| sub byte[block + rbx], 1 | |
| jmp label16 | |
| label15: | |
| add rbx, 1 | |
| add byte[block + rbx], 1 | |
| sub rbx, 1 | |
| sub byte[block + rbx], 1 | |
| jmp label18 | |
| label17: | |
| add rbx, 1 | |
| add byte[block + rbx], 1 | |
| sub rbx, 1 | |
| sub byte[block + rbx], 1 | |
| jmp label20 | |
| label19: | |
| add rbx, 1 | |
| add byte[block + rbx], 1 | |
| sub rbx, 1 | |
| sub byte[block + rbx], 1 | |
| jmp label22 | |
| label21: | |
| add rbx, 1 | |
| add byte[block + rbx], 1 | |
| sub rbx, 1 | |
| sub byte[block + rbx], 1 | |
| jmp label24 | |
| label23: | |
| add rbx, 1 | |
| add byte[block + rbx], 1 | |
| sub rbx, 1 | |
| sub byte[block + rbx], 1 | |
| jmp label26 | |
| label25: | |
| add rbx, 1 | |
| add byte[block + rbx], 1 | |
| sub rbx, 1 | |
| sub byte[block + rbx], 1 | |
| jmp label28 | |
| label27: | |
| add rbx, 1 | |
| add byte[block + rbx], 1 | |
| sub rbx, 1 | |
| sub byte[block + rbx], 1 | |
| jmp label30 | |
| label29: | |
| add rbx, 1 | |
| mov byte[block + rbx], 0 | |
| add rbx, 4 | |
| add byte[block + rbx], 1 | |
| add rbx, 1 | |
| add byte[block + rbx], 1 | |
| sub rbx, 6 | |
| sub byte[block + rbx], 1 | |
| mov al, byte[block + rbx] | |
| add byte[block + rbx + 1], al | |
| mov byte[block + rbx], 0 | |
| label30: | |
| cmp byte[block + rbx], 0 | |
| jnz label29 | |
| label28: | |
| cmp byte[block + rbx], 0 | |
| jnz label27 | |
| label26: | |
| cmp byte[block + rbx], 0 | |
| jnz label25 | |
| label24: | |
| cmp byte[block + rbx], 0 | |
| jnz label23 | |
| label22: | |
| cmp byte[block + rbx], 0 | |
| jnz label21 | |
| label20: | |
| cmp byte[block + rbx], 0 | |
| jnz label19 | |
| label18: | |
| cmp byte[block + rbx], 0 | |
| jnz label17 | |
| label16: | |
| cmp byte[block + rbx], 0 | |
| jnz label15 | |
| label14: | |
| cmp byte[block + rbx], 0 | |
| jnz label13 | |
| label12: | |
| cmp byte[block + rbx], 0 | |
| jnz label11 | |
| add rbx, 1 | |
| mov al, byte[block + rbx] | |
| add byte[block + rbx + -1], al | |
| mov byte[block + rbx], 0 | |
| add byte[block + rbx], 1 | |
| add rbx, 5 | |
| label10: | |
| cmp byte[block + rbx], 0 | |
| jnz label9 | |
| sub rbx, 5 | |
| jmp label32 | |
| label31: | |
| sub rbx, 5 | |
| label32: | |
| cmp byte[block + rbx], 0 | |
| jnz label31 | |
| add rbx, 7 | |
| jmp label34 | |
| label33: | |
| add rbx, 5 | |
| label34: | |
| cmp byte[block + rbx], 0 | |
| jnz label33 | |
| add byte[block + rbx], 2 | |
| jmp label36 | |
| label35: | |
| sub byte[block + rbx], 1 | |
| sub rbx, 5 | |
| label36: | |
| cmp byte[block + rbx], 0 | |
| jnz label35 | |
| add rbx, 6 | |
| sub byte[block + rbx], 1 | |
| label6: | |
| cmp byte[block + rbx], 0 | |
| jnz label5 | |
| add byte[block + rbx], 1 | |
| add rbx, 5 | |
| label4: | |
| cmp byte[block + rbx], 0 | |
| jnz label3 | |
| sub rbx, 1 | |
| mov al, 2 | |
| imul byte[block + rbx] | |
| add [block + rbx + 1], al | |
| mov byte[block + rbx], 0 | |
| sub rbx, 4 | |
| jmp label38 | |
| label37: | |
| sub rbx, 1 | |
| mov al, byte[block + rbx] | |
| add byte[block + rbx + 1], al | |
| mov byte[block + rbx], 0 | |
| sub rbx, 4 | |
| label38: | |
| cmp byte[block + rbx], 0 | |
| jnz label37 | |
| add rbx, 2 | |
| jmp label40 | |
| label39: | |
| sub byte[block + rbx], 1 | |
| add rbx, 1 | |
| mov byte[block + rbx], 0 | |
| add byte[block + rbx], 6 | |
| mov al, 8 | |
| imul byte[block + rbx] | |
| add [block + rbx + -1], al | |
| mov byte[block + rbx], 0 | |
| add rbx, 4 | |
| label40: | |
| cmp byte[block + rbx], 0 | |
| jnz label39 | |
| sub rbx, 5 | |
| jmp label42 | |
| label41: | |
| sub rbx, 1 | |
| mov al, byte[block + rbx] | |
| add byte[block + rbx + 1], al | |
| mov al, byte[block + rbx] | |
| add byte[block + rbx + 2], al | |
| mov byte[block + rbx], 0 | |
| add rbx, 1 | |
| mov dil, byte[block + rbx] | |
| call putchar | |
| sub rbx, 5 | |
| label42: | |
| cmp byte[block + rbx], 0 | |
| jnz label41 | |
| add rbx, 1 | |
| mov dil, byte[block + rbx] | |
| call putchar | |
| add rbx, 4 | |
| label2: | |
| cmp byte[block + rbx], 0 | |
| jnz label1 | |
| pop rbp | |
| xor rdi, rdi | |
| call exit | |
| section .bss | |
| block: resb 30000 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment