Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

Use Assembly Language to create a Vigenère cipher program 1. Your code should us

ID: 3689496 • Letter: U

Question

Use Assembly Language to create a Vigenère cipher program

1. Your code should use STDIN and STDOUT for input and output. (This is the default.) Use redirection on the command line to read from a file and write to a file.
2. Your code should open a file, read it character by character and save it into an array.
3. When you get to the end of the file you should encode the contents of the array with a Vigenère cipher using the keyword CRYPTOGRAM, then print it out.
4. Maintain the distinction between upper-case and lower-case letters, and do not modify non-alphabetic characters. This is not very good for the security of your message, but the result will look neater.
5. This program should use glibc functions. In addition to printf(), you may need getchar() and putchar().
6. Assume that the input file contains just ASCII text Don't worry about what happens with non-text files.

7. Once the encoder is working, build a decoder by duplicating the code and changing the addition to a subtraction.

8. If you use printf() to output the array, remember that a null termination is required on a string.

Explanation / Answer

generateKey(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >):

push rbp

mov rbp, rsp

push rbx

sub rsp, 56

mov QWORD PTR [rbp-40], rdi

mov QWORD PTR [rbp-48], rsi

mov QWORD PTR [rbp-56], rdx

mov rax, QWORD PTR [rbp-48]

mov rdi, rax

call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::size() const

mov DWORD PTR [rbp-24], eax

mov DWORD PTR [rbp-20], 0

.L5:

mov eax, DWORD PTR [rbp-24]

cmp eax, DWORD PTR [rbp-20]

jne .L2

mov DWORD PTR [rbp-20], 0

.L2:

mov rax, QWORD PTR [rbp-56]

mov rdi, rax

call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::size() const

mov rbx, rax

mov rax, QWORD PTR [rbp-48]

mov rdi, rax

call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::size() const

cmp rbx, rax

sete al

test al, al

jne .L8

mov eax, DWORD PTR [rbp-20]

movsx rdx, eax

mov rax, QWORD PTR [rbp-56]

mov rsi, rdx

mov rdi, rax

call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator[](unsigned long)

movzx eax, BYTE PTR [rax]

movsx edx, al

mov rax, QWORD PTR [rbp-56]

mov esi, edx

mov rdi, rax

call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::push_back(char)

add DWORD PTR [rbp-20], 1

jmp .L5

.L8:

nop

mov rdx, QWORD PTR [rbp-56]

mov rax, QWORD PTR [rbp-40]

mov rsi, rdx

mov rdi, rax

call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&)

mov rax, QWORD PTR [rbp-40]

add rsp, 56

pop rbx

pop rbp

ret

cipherText(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >):

push rbp

mov rbp, rsp

push rbx

sub rsp, 56

mov QWORD PTR [rbp-40], rdi

mov QWORD PTR [rbp-48], rsi

mov QWORD PTR [rbp-56], rdx

mov rax, QWORD PTR [rbp-40]

mov rdi, rax

call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string()

mov DWORD PTR [rbp-20], 0

.L11:

mov eax, DWORD PTR [rbp-20]

movsx rbx, eax

mov rax, QWORD PTR [rbp-48]

mov rdi, rax

call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::size() const

cmp rbx, rax

setb al

test al, al

je .L15

mov eax, DWORD PTR [rbp-20]

movsx rdx, eax

mov rax, QWORD PTR [rbp-48]

mov rsi, rdx

mov rdi, rax

call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator[](unsigned long)

movzx eax, BYTE PTR [rax]

movsx ebx, al

mov eax, DWORD PTR [rbp-20]

movsx rdx, eax

mov rax, QWORD PTR [rbp-56]

mov rsi, rdx

mov rdi, rax

call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator[](unsigned long)

movzx eax, BYTE PTR [rax]

movsx eax, al

lea ecx, [rbx+rax]

mov edx, 1321528399

mov eax, ecx

imul edx

sar edx, 3

mov eax, ecx

sar eax, 31

sub edx, eax

mov eax, edx

mov DWORD PTR [rbp-24], eax

mov eax, DWORD PTR [rbp-24]

imul eax, eax, 26

sub ecx, eax

mov eax, ecx

mov DWORD PTR [rbp-24], eax

add DWORD PTR [rbp-24], 65

mov eax, DWORD PTR [rbp-24]

movsx edx, al

mov rax, QWORD PTR [rbp-40]

mov esi, edx

mov rdi, rax

call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::push_back(char)

add DWORD PTR [rbp-20], 1

jmp .L11

mov rbx, rax

mov rax, QWORD PTR [rbp-40]

mov rdi, rax

call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()

mov rax, rbx

mov rdi, rax

call _Unwind_Resume

.L15:

nop

mov rax, QWORD PTR [rbp-40]

add rsp, 56

pop rbx

pop rbp

ret

originalText(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >):

push rbp

mov rbp, rsp

push rbx

sub rsp, 56

mov QWORD PTR [rbp-40], rdi

mov QWORD PTR [rbp-48], rsi

mov QWORD PTR [rbp-56], rdx

mov rax, QWORD PTR [rbp-40]

mov rdi, rax

call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string()

mov DWORD PTR [rbp-20], 0

.L18:

mov eax, DWORD PTR [rbp-20]

movsx rbx, eax

mov rax, QWORD PTR [rbp-48]

mov rdi, rax

call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::size() const

cmp rbx, rax

setb al

test al, al

je .L22

mov eax, DWORD PTR [rbp-20]

movsx rdx, eax

mov rax, QWORD PTR [rbp-48]

mov rsi, rdx

mov rdi, rax

call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator[](unsigned long)

movzx eax, BYTE PTR [rax]

movsx ebx, al

mov eax, DWORD PTR [rbp-20]

movsx rdx, eax

mov rax, QWORD PTR [rbp-56]

mov rsi, rdx

mov rdi, rax

call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator[](unsigned long)

movzx eax, BYTE PTR [rax]

movsx eax, al

sub ebx, eax

mov eax, ebx

lea ecx, [rax+26]

mov edx, 1321528399

mov eax, ecx

imul edx

sar edx, 3

mov eax, ecx

sar eax, 31

sub edx, eax

mov eax, edx

mov DWORD PTR [rbp-24], eax

mov eax, DWORD PTR [rbp-24]

imul eax, eax, 26

sub ecx, eax

mov eax, ecx

mov DWORD PTR [rbp-24], eax

add DWORD PTR [rbp-24], 65

mov eax, DWORD PTR [rbp-24]

movsx edx, al

mov rax, QWORD PTR [rbp-40]

mov esi, edx

mov rdi, rax

call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::push_back(char)

add DWORD PTR [rbp-20], 1

jmp .L18

mov rbx, rax

mov rax, QWORD PTR [rbp-40]

mov rdi, rax

call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()

mov rax, rbx

mov rdi, rax

call _Unwind_Resume

.L22:

nop

mov rax, QWORD PTR [rbp-40]

add rsp, 56

pop rbx

pop rbp

ret

.LC0:

.string "HELLOWORLD"

.LC1:

.string "PROGRAM"

.LC2:

.string "Ciphertext : "

.LC3:

.string " "

.LC4:

.string "Original/Decrypted Text : "

main:

push rbp

mov rbp, rsp

push rbx

sub rsp, 376

lea rax, [rbp-242]

mov rdi, rax

call std::allocator<char>::allocator()

lea rdx, [rbp-242]

lea rax, [rbp-288]

mov esi, OFFSET FLAT:.LC0

mov rdi, rax

call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)

lea rax, [rbp-242]

mov rdi, rax

call std::allocator<char>::~allocator()

lea rax, [rbp-241]

mov rdi, rax

call std::allocator<char>::allocator()

lea rdx, [rbp-241]

lea rax, [rbp-320]

mov esi, OFFSET FLAT:.LC1

mov rdi, rax

call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)

lea rax, [rbp-241]

mov rdi, rax

call std::allocator<char>::~allocator()

lea rdx, [rbp-320]

lea rax, [rbp-240]

mov rsi, rdx

mov rdi, rax

call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)

lea rdx, [rbp-288]

lea rax, [rbp-208]

mov rsi, rdx

mov rdi, rax

call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)

lea rax, [rbp-352]

lea rdx, [rbp-240]

lea rcx, [rbp-208]

mov rsi, rcx

mov rdi, rax

call generateKey(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)

lea rax, [rbp-208]

mov rdi, rax

call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()

lea rax, [rbp-240]

mov rdi, rax

call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()

lea rdx, [rbp-352]

lea rax, [rbp-176]

mov rsi, rdx

mov rdi, rax

call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)

lea rdx, [rbp-288]

lea rax, [rbp-144]

mov rsi, rdx

mov rdi, rax

call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)

lea rax, [rbp-384]

lea rdx, [rbp-176]

lea rcx, [rbp-144]

mov rsi, rcx

mov rdi, rax

call cipherText(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)

lea rax, [rbp-144]

mov rdi, rax

call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()

lea rax, [rbp-176]

mov rdi, rax

call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()

mov esi, OFFSET FLAT:.LC2

mov edi, OFFSET FLAT:std::cout

call std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)

mov rdx, rax

lea rax, [rbp-384]

mov rsi, rax

mov rdi, rdx

call std::basic_ostream<char, std::char_traits<char> >& std::operator<< <char, std::char_traits<char>, std::allocator<char> >(std::basic_ostream<char, std::char_traits<char> >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)

mov esi, OFFSET FLAT:.LC3

mov rdi, rax

call std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)

mov esi, OFFSET FLAT:.LC4

mov edi, OFFSET FLAT:std::cout

call std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)

mov rbx, rax

lea rdx, [rbp-352]

lea rax, [rbp-80]

mov rsi, rdx

mov rdi, rax

call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)

lea rdx, [rbp-384]

lea rax, [rbp-48]

mov rsi, rdx

mov rdi, rax

call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)

lea rax, [rbp-112]

lea rdx, [rbp-80]

lea rcx, [rbp-48]

mov rsi, rcx

mov rdi, rax

call originalText(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)

lea rax, [rbp-112]

Hire Me For All Your Tutoring Needs
Integrity-first tutoring: clear explanations, guidance, and feedback.
Drop an Email at
drjack9650@gmail.com
Chat Now And Get Quote