103 lines
4.3 KiB
Plaintext
103 lines
4.3 KiB
Plaintext
# Author: Ettore Forigo - Hexwell
|
|
|
|
.intel_syntax noprefix
|
|
|
|
.text
|
|
.globl main
|
|
main:
|
|
.PROLOGUE:
|
|
push rbp
|
|
mov rbp, rsp
|
|
sub rsp, 32
|
|
mov QWORD PTR [rbp-32], rsi # argv
|
|
|
|
.BODY:
|
|
mov BYTE PTR [rbp-1], 0 # shift = 0
|
|
|
|
.I_LOOP_INIT:
|
|
mov BYTE PTR [rbp-2], 0 # i = 0
|
|
jmp .I_LOOP_CONDITION # I_LOOP_CONDITION
|
|
.I_LOOP_BODY:
|
|
movzx edx, BYTE PTR[rbp-1] # shift
|
|
mov eax, edx # shift
|
|
sal eax, 2 # shift << 2 == i * 4
|
|
add eax, edx # shift * 4 + shift = shift * 5
|
|
add eax, eax # shift * 5 + shift * 5 = shift * 10
|
|
mov ecx, eax # shift * 10
|
|
mov rax, QWORD PTR [rbp-32] # argv
|
|
add rax, 8 # argv + 1
|
|
mov rdx, QWORD PTR [rax] # argv[1]
|
|
movzx eax, BYTE PTR [rbp-2] # i
|
|
add rax, rdx # argv[1] + i
|
|
movzx eax, BYTE PTR [rax] # argv[1][i]
|
|
add eax, ecx # shift * 10 + argv[1][i]
|
|
sub eax, 48 # shift * 10 + argv[1][i] - '0'
|
|
mov BYTE PTR [rbp-1], al # shift = shift * 10 + argv[1][i] - '0'
|
|
.I_LOOP_INCREMENT:
|
|
movzx eax, BYTE PTR [rbp-2] # i
|
|
add eax, 1 # i + 1
|
|
mov BYTE PTR [rbp-2], al # i++
|
|
.I_LOOP_CONDITION:
|
|
mov rax, QWORD PTR [rbp-32] # argv
|
|
add rax, 8 # argv + 1
|
|
mov rax, QWORD PTR [rax] # argv[1]
|
|
movzx edx, BYTE PTR [rbp-2] # i
|
|
add rax, rdx # argv[1] + i
|
|
movzx rax, BYTE PTR [rax] # argv[1][i]
|
|
test al, al # argv[1][i]?
|
|
jne .I_LOOP_BODY # I_LOOP_BODY
|
|
|
|
.CAESAR_LOOP_INIT:
|
|
mov BYTE PTR [rbp-2], 0 # i = 0
|
|
jmp .CAESAR_LOOP_CONDITION # CAESAR_LOOP_CONDITION
|
|
.CAESAR_LOOP_BODY:
|
|
mov rax, QWORD PTR [rbp-32] # argv
|
|
add rax, 16 # argv + 2
|
|
mov rdx, QWORD PTR [rax] # argv[2]
|
|
movzx eax, BYTE PTR [rbp-2] # i
|
|
add rax, rdx # argv[2] + i
|
|
mov rbx, rax # argv[2] + i
|
|
movzx eax, BYTE PTR [rax] # argv[2][i]
|
|
cmp al, 32 # argv[2][i] == ' '
|
|
je .CAESAR_LOOP_INCREMENT # CAESAR_LOOP_INCREMENT
|
|
movzx edx, BYTE PTR [rbx] # argv[2][i]
|
|
mov ecx, edx # argv[2][i]
|
|
movzx edx, BYTE PTR [rbp-1] # shift
|
|
add edx, ecx # argv[2][i] + shift
|
|
sub edx, 97 # argv[2][i] + shift - 'a'
|
|
mov BYTE PTR [rbx], dl # argv[2][i] = argv[2][i] + shift - 'a'
|
|
movzx eax, BYTE PTR [rbx] # argv[2][i]
|
|
cmp al, 25 # argv[2][i] <=> 25
|
|
jle .CAESAR_RESTORE_ASCII # <= CAESAR_RESTORE_ASCII
|
|
movzx edx, BYTE PTR [rbx] # argv[2][i]
|
|
sub edx, 26 # argv[2][i] - 26
|
|
mov BYTE PTR [rbx], dl # argv[2][i] = argv[2][i] - 26
|
|
.CAESAR_RESTORE_ASCII:
|
|
movzx edx, BYTE PTR [rbx] # argv[2][i]
|
|
add edx, 97 # argv[2][i] + 'a'
|
|
mov BYTE PTR [rbx], dl # argv[2][i] = argv[2][i] + 'a'
|
|
.CAESAR_LOOP_INCREMENT:
|
|
movzx eax, BYTE PTR [rbp-2] # i
|
|
add eax, 1 # i + 1
|
|
mov BYTE PTR [rbp-2], al # i++
|
|
.CAESAR_LOOP_CONDITION:
|
|
mov rax, QWORD PTR [rbp-32] # argv
|
|
add rax, 16 # argv + 2
|
|
mov rdx, QWORD PTR [rax] # argv[2]
|
|
movzx eax, BYTE PTR [rbp-2] # i
|
|
add rax, rdx # argv[2] + i
|
|
movzx eax, BYTE PTR [rax] # argv[2][i]
|
|
test al, al # argv[2][i]?
|
|
jne .CAESAR_LOOP_BODY # CAESAR_LOOP_BODY
|
|
|
|
mov rax, QWORD PTR [rbp-32] # argv
|
|
add rax, 16 # argv + 2
|
|
mov rax, QWORD PTR [rax] # argv[2]
|
|
mov rdi, rax # argv[2]
|
|
call puts # puts(argv[2])
|
|
|
|
.RETURN:
|
|
mov eax, 0 # 0
|
|
leave
|
|
ret # return 0
|