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

## palindrome.asm -- get some text and test if it is a palindrome. ## Register u

ID: 3759263 • Letter: #

Question

   ## palindrome.asm -- get some text and test if it is a palindrome. ## Register usage (simple collection): ## $t1 - A. ## $t2 - B. ## $t3 - the character at address A. ## $t4 - the character at address B. ## $v0 - syscall parameter / return values. ## $a0 - syscall parameters. ## $a1 - syscall parameters.  .text main: # starts @ main. ## read the string S: la $a0, string_data li $a1, 1024 li $v0, 8 # load "get_string" code into $v0.  syscall la $t1, string_data # A = S. la $t2, string_data ## we need to move B to the end  length_loop: # of the string: lb $t3, ($t2) # load the byte at addr B into $t3. beqz $t3, end_length_loop # if $t3 == 0, leave loop. addu $t2, $t2, 1 # else, increment B, b length_loop # repeat loop. end_length_loop:  subu $t2, $t2, 2 ## subtract 2 to move B back past # the (eol)  and  .  test_loop: bge $t1, $t2, is_palin # if A >= B, its a palindrome. lb $t3, ($t1) # load the byte at addr A into $t3, lb $t4, ($t2) # load the byte at addr B into $t4. bne $t3, $t4, not_palin # if $t3 != $t4, is not a palindrome. # Else, addu $t1, $t1, 1 # increment A, subu $t2, $t2, 1 # decrement B, b test_loop # and repeat the loop.  is_palin: ## print the is_palin_msg, and exit. la $a0, is_palin_msg li $v0, 4 syscall b exit  not_palin: la $a0, not_palin_msg ## print the is_palin_msg, and exit. li $v0, 4 syscall b exit  exit: ## exit code li $v0, 10 # load "exit" into $v0 syscall # make the system call.  ## Heres where the data for the program is allocated: .data string_data: .space 1024 # reserve 1024 bytes for the string. is_palin_msg: .asciiz "The string is a palindrome. " not_palin_msg: .asciiz "The string is not a palindrome. "  ## end of pal.asm 

Explanation / Answer

Program:

              

.data

            

        .string "Enter a string:"

        .LC1:.string   "The string is a palindrome. "

        .LC2:.string   "The string is a not palindrome. "

    

.text

main:

       .LFB0:         

               pushq   %rbp   

               movq    %rsp, %rbp

             addq    $-128, %rsp

               movq    %fs:40, %rax

               movq    %rax, -8(%rbp)

               xorl    %eax, %eax

              

               movl    $.LC0, %edi

   

               leaq    -112(%rbp), %rax

               movq    %rax, %rdi

       

               leaq    -112(%rbp), %rax

               movq    %rax, %rdi

               movl    %eax, -116(%rbp)

              

               cmpl    $1, -116(%rbp)

               jne     .L2

               leaq    -112(%rbp), %rax

               movq    %rax, %rsi

               movl    $.LC1, %edi

                movl    $0, %eax

               jmp     .L3

            

        .L2:

               leaq    -112(%rbp), %rax

               movq    %rax, %rsi

               movl    $.LC2, %edi

               movl    $0, %eax

              

        .L3:

               movl    $0, %eax

   

               movq    -8(%rbp), %rdx

               xorq    %fs:40, %rdx

               je      .L5

        .L5:

               leave

             ret

            

        .LFB1:

             pushq   %rbp

               movq    %rsp, %rbp

             subq    $32, %rsp

               movq    %rdi, -24(%rbp)

              

               movq    -24(%rbp), %rax

               movq    %rax, %rdi

                jmp    .LFB2    

               movl    %eax, -16(%rbp)

               movl    -16(%rbp), %eax

               addl    $1, %eax

               cltq

               movq    %rax, %rdi

               movq    %rax, -8(%rbp)

               movq    -24(%rbp), %rdx

               movq    -8(%rbp), %rax

               movq    %rdx, %rsi

               movq    %rax, %rdi

               jmp   .LFB3

              

               movq    -8(%rbp), %rax

               movq    %rax, %rdi

               jmp   .LFB4

               movq    -8(%rbp), %rdx

               movq    -24(%rbp), %rax

               movq    %rdx, %rsi

               movq    %rax, %rdi

               jmp     .LFB5

               movl    %eax, -12(%rbp)

              

               movq    -8(%rbp), %rax

               movq    %rax, %rdi

       

   

               cmpl    $0, -12(%rbp)

               jne     .L7

               movl    $1, %eax

               jmp     .L8

        .L7:

               movl    $0, %eax

   

        .L8:

               leave

             ret

                      

     

      .LFB2:

             pushq   %rbp

               movq    %rsp, %rbp

               movq    %rdi, -24(%rbp)

               movl    $0, -4(%rbp)

               jmp     .L10

             .L11:

               addl    $1, -4(%rbp)

               addq    $1, -24(%rbp)

             .L10:

               movq    -24(%rbp), %rax

               movzbl (%rax), %eax

               testb   %al, %al

               jne     .L11

               movl    -4(%rbp), %eax

               popq    %rbp

               ret

            

       .LFB3:

               pushq   %rbp

               movq    %rsp, %rbp

               movq    %rdi, -8(%rbp)

               movq    %rsi, -16(%rbp)

               jmp     .L14

             .L15:

               movq    -16(%rbp), %rax

               movzbl (%rax), %edx

               movq    -8(%rbp), %rax

               movb    %dl, (%rax)

               addq    $1, -16(%rbp)

               addq    $1, -8(%rbp)

             .L14:

               movq    -16(%rbp), %rax

               movzbl (%rax), %eax

               testb   %al, %al

               jne     .L15

               movq    -8(%rbp), %rax

               movb    $0, (%rax)

               popq    %rbp

             ret

            

      .LFB4:

             pushq   %rbp

               movq    %rsp, %rbp

               subq    $40, %rsp

               movq    %rdi, -40(%rbp)

               movq    -40(%rbp), %rax

               movq    %rax, %rdi

               jmp     .LFB2               

               movl    %eax, -20(%rbp)

               movq    -40(%rbp), %rax

               movq    %rax, -16(%rbp)

               movq    -40(%rbp), %rax

               movq    %rax, -8(%rbp)

               movl    $0, -24(%rbp)

               jmp     .L17

             .L18:

               addl    $1, -24(%rbp)

               addq    $1, -8(%rbp)

             .L17:

               movl    -20(%rbp), %eax

               subl    $1, %eax

               cmpl    -24(%rbp), %eax

               jg      .L18

               movl    $0, -24(%rbp)

               jmp     .L19

             .L20:

               addl    $1, -24(%rbp)

               movq    -8(%rbp), %rax

               movzbl (%rax), %eax

               movb    %al, -25(%rbp)

               movq    -16(%rbp), %rax

               movzbl (%rax), %edx

               movq    -8(%rbp), %rax

               movb    %dl, (%rax)

               movq    -16(%rbp), %rax

               movzbl -25(%rbp), %edx

               movb    %dl, (%rax)

               addq    $1, -16(%rbp)

   

               subq    $1, -8(%rbp)

             .L19:

               movl    -20(%rbp), %eax

               movl    %eax, %edx

             shrl    $31, %edx

               addl    %edx, %eax

               sarl    %eax

               cmpl    -24(%rbp), %eax

               jg      .L20

               leave

             ret

                      

            

       .LFB5:

                pushq   %rbp   

               movq    %rsp, %rbp    

               movq    %rdi, -8(%rbp)

               movq    %rsi, -16(%rbp)

               jmp     .L22

             .L24:

               movq    -8(%rbp), %rax

               movzbl (%rax), %eax

               testb   %al, %al

               je      .L23

               movq    -16(%rbp), %rax

               movzbl (%rax), %eax

               testb   %al, %al

               je      .L23

               addq    $1, -8(%rbp)

               addq    $1, -16(%rbp)

    

                .L22:

               movq    -8(%rbp), %rax

               movzbl (%rax), %edx

               movq    -16(%rbp), %rax

               movzbl (%rax), %eax

               cmpb    %al, %dl

               je      .L24

             .L23:

               movq    -8(%rbp), %rax

               movzbl (%rax), %eax

               testb   %al, %al

               jne     .L25

               movq    -16(%rbp), %rax

               movzbl (%rax), %eax

               testb   %al, %al

               jne     .L25

               movl    $0, %eax

    

               jmp     .L26

             .L25:

               movl    $-1, %eax

   

             .L26:

               popq    %rbp

               ret

     .text0: