Skip to content

Instantly share code, notes, and snippets.

@dkaraush
Created December 1, 2025 13:15
Show Gist options
  • Select an option

  • Save dkaraush/44acbb987de3bbea661dea282aaa9f88 to your computer and use it in GitHub Desktop.

Select an option

Save dkaraush/44acbb987de3bbea661dea282aaa9f88 to your computer and use it in GitHub Desktop.
default rel
section .data
filename: db "input.txt", 0
section .bss
char: resq 1
number_string: resq 32
number: resq 1
isL: resq 1
password1: resq 1
password2: resq 1
dial: resq 1
section .text
global _main
; read_number() => [rel char]
read_char:
mov rax, 0x2000003 ; read
mov rdi, r15 ; fd
lea rsi, [rel char]
mov rdx, 1
syscall
ret
; read_number() => r14
read_number:
xor r14, r14
.loop:
call read_char
cmp al, 0
je .done
; if (char < '0' || char > '9') return
movzx rbx, byte [rel char]
cmp bl, '0'
jb .done
cmp bl, '9'
ja .done
; number = (char - '0') + number * 10
imul r14, r14, 10
sub bl, '0'
add r14, rbx
jmp .loop
.done:
ret
; print_number(c: [rel char])
print_char:
push rax
push rdi
push rsi
push rdx
mov rax, 0x2000004 ; write
mov rdi, 1 ; stdout
lea rsi, [rel char]
mov rdx, 1
syscall
pop rax
pop rdi
pop rsi
pop rdx
ret
; print_number(num: r14)
print_number:
push r14
cmp r14, 0
jge .skip_negative
mov byte [char], '-'
call print_char
neg r14
.skip_negative:
cmp r14, 0
jne .skip_zero
mov byte [char], '0'
call print_char
pop r14
ret
.skip_zero:
mov rax, r14
lea rcx, [rel number_string]
lea r8, [rcx + 32]
mov rsi, r8
mov rbx, 10
.buff_loop:
cmp rax, 0
je .buff_end
cqo
idiv rbx
add dl, '0'
dec rsi
mov [rsi], dl
jmp .buff_loop
.buff_end:
mov rdx, r8
sub rdx, rsi
mov rax, 0x2000004 ; write
mov rdi, 1 ; stdout
syscall
pop r14
ret
print_newline:
mov byte [char], 10
call print_char
ret
handle_r:
xor rcx, rcx
.loop:
cmp rax, 0
je .done
inc rbx
dec rax
cmp rbx, 100
jne .loop
mov rbx, 0
inc rcx
jmp .loop
.done:
ret
handle_l:
xor rcx, rcx
.loop:
cmp rax, 0
je .done
dec rbx
dec rax
cmp rbx, 0
jne .continue
inc rcx
.continue:
cmp rbx, 0
jge .loop
mov rbx, 99
jmp .loop
.done:
ret
_main:
mov rax, 0x2000005
lea rdi, [rel filename]
xor rsi, rsi
xor rdx, rdx
syscall
mov r15, rax ; r15 = fd
mov [rel dial], 50
mov [rel password1], 0
mov [rel password2], 0
.read_loop:
; while (char = read(fd, 1)) {
call read_char
cmp rax, 0
je .done
cmp byte [rel char], 'L'
sete byte [rel isL]
; call print_char
call read_number
; call print_number
mov rax, r14
mov rbx, [rel dial]
cmp [rel isL], 1
jne .R
call handle_l
jmp .continue
.R:
call handle_r
.continue:
mov [rel dial], rbx
mov rax, [rel password2]
add rax, rcx
mov [rel password2], rax
; mov [rel char], ' '
; call print_char
mov r14, [rel dial]
; call print_number
; call print_newline
cmp [rel dial], 0
jne .read_loop
mov eax, [rel password1]
inc eax
mov [rel password1], eax
jmp .read_loop
.done:
mov r14, [rel password1]
call print_number
call print_newline
mov r14, [rel password2]
call print_number
call print_newline
mov rax, 0x2000006 ; close(fd)
mov rdi, r15
syscall
mov rax, 0x2000001 ; exit(0)
xor rdi, rdi
syscall
nasm -fmacho64 hello.asm -o hello.o
clang -arch x86_64 -mmacosx-version-min=10.13 hello.o -o hello
arch -x86_64 ./hello
# time arch -x86_64 ./hello
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment