Created
December 1, 2025 13:15
-
-
Save dkaraush/44acbb987de3bbea661dea282aaa9f88 to your computer and use it in GitHub Desktop.
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
| 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 |
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 -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