Add rot13
This commit is contained in:
parent
023eb63f8d
commit
d201cd1173
2
rot13/.gitignore
vendored
Normal file
2
rot13/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
rot13*
|
||||||
|
.gdb_history
|
6
rot13/README.md
Normal file
6
rot13/README.md
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
Rot13
|
||||||
|
=====
|
||||||
|
## A rot13 program in amd64 linux asm.
|
||||||
|
|
||||||
|
Be warned: it does not appear to be possible to enter more than 4096 bytes,
|
||||||
|
because if you do, it gets truncated.
|
99
rot13/main.asm
Normal file
99
rot13/main.asm
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
global _start
|
||||||
|
|
||||||
|
; bss is the section for data like buffers that is zeroed out
|
||||||
|
section .bss
|
||||||
|
; Reserve 1KiB for the buffer size. Do not reserve more than `(2^65)-1` bytes,
|
||||||
|
; as that is the maximum size allowed (the counter register and/or the bytes
|
||||||
|
; read will overflow and cause bugs)
|
||||||
|
buf: resb 8192
|
||||||
|
; This should be equal to the buffer size, if it is smaller it's a waste, if
|
||||||
|
; it's bigger it can segfault.
|
||||||
|
BUF_S: equ 8192
|
||||||
|
|
||||||
|
section .text
|
||||||
|
_start:
|
||||||
|
; Read into buffer
|
||||||
|
xor rax, rax
|
||||||
|
mov rsi, buf
|
||||||
|
mov rdx,BUF_S
|
||||||
|
syscall
|
||||||
|
; Clear rcx (rcx to be the counter)
|
||||||
|
xor rcx,rcx
|
||||||
|
|
||||||
|
rot_loop:
|
||||||
|
; If counter is equal to max bytes,
|
||||||
|
cmp rcx, rax
|
||||||
|
; Done, jump to finish.
|
||||||
|
je done
|
||||||
|
; Set lowest byte of rdx to buf[rcx].
|
||||||
|
mov dl, byte [buf+rcx]
|
||||||
|
; If dl is greater than or equal to 'a',
|
||||||
|
cmp dl, 97
|
||||||
|
; Go to lowercase.
|
||||||
|
jge lower
|
||||||
|
; If dl is greater than or equal to 'A',
|
||||||
|
cmp dl, 65
|
||||||
|
; Go to uppercase.
|
||||||
|
jge upper
|
||||||
|
|
||||||
|
; Else, it's not a letter, inc rcx and go back to start of loop.
|
||||||
|
inc rcx
|
||||||
|
jmp rot_loop
|
||||||
|
|
||||||
|
lower:
|
||||||
|
; If dl is greater than 'z',
|
||||||
|
cmp dl, 122
|
||||||
|
; It's not a letter, so go to special char.
|
||||||
|
jg special
|
||||||
|
; If dl is less than or equal to 'm',
|
||||||
|
cmp dl, 109
|
||||||
|
; Add 13 letters.
|
||||||
|
jle up13
|
||||||
|
; Else, subtract 13.
|
||||||
|
jmp down13
|
||||||
|
|
||||||
|
; This loop does the exact thing as `lower` but uses uppercase letters instead.
|
||||||
|
upper:
|
||||||
|
cmp dl, 90
|
||||||
|
jg special
|
||||||
|
cmp dl, 77
|
||||||
|
jle up13
|
||||||
|
jmp down13
|
||||||
|
|
||||||
|
; This handles special chars, it just increments rcx and goes to the start of
|
||||||
|
; the loop.
|
||||||
|
special:
|
||||||
|
inc rcx
|
||||||
|
jmp rot_loop
|
||||||
|
|
||||||
|
; Adds 13 to dl, increments rcx, and goes to loop start.
|
||||||
|
up13:
|
||||||
|
add dl, 13
|
||||||
|
mov byte [buf+rcx], dl
|
||||||
|
inc rcx
|
||||||
|
jmp rot_loop
|
||||||
|
|
||||||
|
; Same as up13 but subtracts instead.
|
||||||
|
down13:
|
||||||
|
sub dl, 13
|
||||||
|
mov byte [buf+rcx], dl
|
||||||
|
inc rcx
|
||||||
|
jmp rot_loop
|
||||||
|
|
||||||
|
; If done, print buffer (it has been rot13ed) and exit(0)
|
||||||
|
done:
|
||||||
|
mov rdx, rax
|
||||||
|
mov rax, 1
|
||||||
|
mov rdi, 1
|
||||||
|
mov rsi, buf
|
||||||
|
syscall
|
||||||
|
|
||||||
|
cmp byte [buf+rax-1], 0xA
|
||||||
|
jne _start
|
||||||
|
|
||||||
|
mov rax, 60
|
||||||
|
xor rdi,rdi
|
||||||
|
syscall
|
||||||
|
|
||||||
|
; vim: set ft=nasm:
|
||||||
|
; vim: set ai:
|
BIN
rot13/main.o
Normal file
BIN
rot13/main.o
Normal file
Binary file not shown.
8
rot13/make.sh
Executable file
8
rot13/make.sh
Executable file
@ -0,0 +1,8 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
if [ "$1" == "rot13.dbg" ]; then
|
||||||
|
nasm -felf64 -g main.asm
|
||||||
|
ld main.o -o rot13.dbg
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
nasm -felf64 main.asm
|
||||||
|
ld main.o -s -o rot13
|
Loading…
Reference in New Issue
Block a user