## 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:
Related Questions
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.