Skip to content

Instantly share code, notes, and snippets.

@ddevault
Last active December 28, 2021 23:15
Show Gist options
  • Save ddevault/e9e6fcf19bdf80a1d1fe4cd5fe7f9b94 to your computer and use it in GitHub Desktop.
Save ddevault/e9e6fcf19bdf80a1d1fe4cd5fe7f9b94 to your computer and use it in GitHub Desktop.
; I was bored so I implemented left-pad in x86_64 assembly
; assembly rools node drools
; nasm -felf64 -o leftpad leftpad.S
; ld -o leftpad leftpad.o
; ./leftpad 15 "hello world!"
%define SYS_write 1
%define SYS_exit 60
%define STDOUT_FILENO 1
section .text
bits 64
global _start
_start:
mov rbx, [rsp] ; argc
cmp rbx, 3
jne .exit_usage
mov rdi, [rsp + 8 * 2] ; argv[1]
call atoi
mov r12, rax
cld
mov rdi, [rsp + 8 * 3] ; argv[2]
mov rcx, -1
mov rax, 0
repne scasb
neg rcx
dec rcx
dec rcx
push rcx
cmp rcx, r12
jge .user_string
sub r12, rcx
mov rcx, r12
mov rsi, padding_str
mov rdx, 1 ; len
.padding:
mov r12, rcx
mov rax, SYS_write
mov rdi, STDOUT_FILENO
syscall
mov rcx, r12
loop .padding
.user_string:
pop rdx
mov rax, SYS_write
mov rdi, STDOUT_FILENO
mov rsi, [rsp + 8 * 3]
syscall
; and a newline for good measure
mov rax, SYS_write
mov rdx, 1
mov rsi, newline
syscall
.exit:
mov rax, SYS_exit
xor rdi, rdi
syscall
.exit_usage:
mov rax, SYS_write
mov rdi, STDOUT_FILENO
mov rsi, err_usage
mov rdx, err_usage_len
syscall
mov rax, SYS_exit
mov rdi, 1
syscall
atoi:
xor rsi, rsi
mov rax, rsi
mov rcx, rsi
.loop:
mov cl, [rdi]
cmp rcx, rsi
je .exit
imul rax, 10
mov r10, '0'
sub rcx, r10
add rax, rcx
inc rdi
jmp .loop
.exit:
ret
section .rodata
padding_str:
db " "
err_usage:
db "Usage: leftpad <min> <text>"
newline:
db 0xA
err_usage_len: equ $ - err_usage
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment