Skip to content

Instantly share code, notes, and snippets.

@marethyu
Last active August 21, 2020 03:11
Show Gist options
  • Select an option

  • Save marethyu/a79306ffc339452f2a760bf3548e8ebe to your computer and use it in GitHub Desktop.

Select an option

Save marethyu/a79306ffc339452f2a760bf3548e8ebe to your computer and use it in GitHub Desktop.
x64 Assembly program to print factorials between one to infinity.
; $ 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