# ========================================================================== # ROT-13 encoder # ========================================================================== # Apply ROT-13 encoding to a string of lower-case characters and spaces # # Inf2C-CS Coursework 1, Task A # SOLUTION # # Paul Jackson # 10 Oct 2012 # #================================================================== # DATA SEGMENT #================================================================== .data #------------------------------------------------------------------ # Constant strings for output messages #------------------------------------------------------------------ prompt1: .asciiz " input: " outprefix: .asciiz "\noutput: " newline: .asciiz "\n" #------------------------------------------------------------------ # Global variables in memory #------------------------------------------------------------------ # #define BUF_SIZE 40 # char buf[BUF_SIZE]; buf: .space 40 # // Allocate 40 bytes for buf #================================================================== # TEXT SEGMENT #================================================================== .text #------------------------------------------------------------------ # Registers allocated for global variables #------------------------------------------------------------------ # None. #------------------------------------------------------------------ # MAIN code block #------------------------------------------------------------------ main: li $v0, 4 # print_string("input: "); la $a0, prompt1 syscall li $v0, 8 # read_string(buf, BUF_SIZE) la $a0, buf li $a1, 40 syscall li $v0, 4 # print_string("\noutput: "); la $a0, outprefix syscall # char* buf_p // Use $s0 for buf_p la $s0, buf # buf_p = buf ; loop: # while (1) # { # int c // Use $t0 for c lbu $t0, 0($s0) # c = *buf_p beqz $t0, main_end # if (c == '\0') break ; # if ('a' <= c && c <= 'z') li $t1, 'a' # // $t1 = 'a' slt $t2, $t0, $t1 # // $t2 = c < 'a' bnez $t2, writechar # // Skip encoding if c < 'a' li $t2, 'z' # // $t2 = 'z' slt $t3, $t2, $t0 # // $t3 = 'z' < c bnez $t3, writechar # // Skip encoding if 'z' < c # { // Do encoding addi $t0, $t0, 13 # c = c + 13 ; # if (c > 'z') slt $t3, $t2, $t0 # // $t3 = 'z' < c beqz $t3, writechar # // Skip shift down if c <= 'z' # { addi $t0, $t0, -26 # c = c - 26 ; # } # } writechar: sb $t0, 0($s0) # *buf_p = c ; addi $s0, $s0, 1 # buf_p++ ; j loop # } main_end: li $v0, 4 # print_string(buf); la $a0, buf syscall li $v0, 4 # print_string("\n"); la $a0, newline syscall li $v0, 10 # exit() syscall #---------------------------------------------------------------- # END OF CODE #----------------------------------------------------------------