1

I'm asking a user for input and I want to replace each character of the word by the number of uppercase characters in this word

Example: Input: AaAA output: 3333 (4 letters - 3 uppercase)

The part for counting upercase letters in a word works (stored in $t5)

However I cannot replace e.g "3333" with "AaAA". I'm trying to do it using sb in word_replace section. In my output I can see boxes instead of numbers.

Here is my code:

.data
prompt: .asciiz "Enter a string: "
msgout: .asciiz "Output string: "
input:  .space  256
output: .space  256
    .text
    .globl main

main:
    li  $v0, 4          # Print enter a string prompt
    la  $a0, prompt     
    syscall

    li  $v0, 8          # Ask the user for the string they want to reverse
    la  $a0, input      # We'll store it in 'input'
    li  $a1, 256        # Only 256 chars/bytes allowed
    syscall

    la  $t2, ($a0)      # t2 - input string

    word:
        li  $t1, 0              # Normal counter
        li  $t5, 0              # Uppercase counter

        word_countUppercase:
            add $t3, $t2, $t1       # $t2 is the base address for our 'input' array, add loop index
            lb  $t4, 0($t3)     # load a byte at a time according to counter    

            bltu    $t4, ' ', word_prereplace   # We found end of word

            addi    $t1, $t1, 1     # Advance our counter (i++)

            bltu    $t4, 'A', word_countUppercase
            bgtu    $t4, 'Z', word_countUppercase

            addi    $t5, $t5, 1         # Advance our counter (i++)
            j   word_countUppercase

        word_prereplace:
            la  $t2, ($a0)      # t2 - input string
            li  $t1, 0          # Normal counter

            word_replace:
                add $t3, $t2, $t1       # $t2 is the base address for our 'input' array, add loop index
                lb  $t4, 0($t3)     # load a byte at a time according to counter    

                bltu    $t4, ' ', exit      # We found end of word

                sb  $t5, output($t1)    # Overwrite this byte address in memory 

                addi    $t1, $t1, 1         # Advance our counter (i++)
                j   word_replace


exit:
    li  $v0, 4          # Print msgout
    la  $a0, msgout
    syscall

    li  $v0, 4          # Print the output string!
    la  $a0, output
    syscall

    li  $v0, 10         # exit()
    syscall
Ped7g
  • 16,236
  • 3
  • 26
  • 63
sswwqqaa
  • 1,545
  • 3
  • 15
  • 29
  • How is `AaAA` related to `3333`? – wallyk Nov 10 '18 at 18:22
  • There are 3 uppercase letters so 3 and there are 4 of them so 3333. Added more details in description. – sswwqqaa Nov 10 '18 at 18:23
  • 3
    the character "3" has ASCII code 0x33 (51 decimal), so you have to do `addi $t5, $t5, '0'` (or `addi $t5, $t5, 48` if your assembler does not support parsing ASCII characters in single quotes) before overwriting the word letters. Also this will work only up to count 9, for count 10 the +48 will produce value 58, which in ASCII encoding encodes character `':'`, etc... The "boxes" you see are "non-printable" (although it does print a box, so it's sort of printable) character mapped to value 3. – Ped7g Nov 10 '18 at 19:09
  • Are you supposed to assume that the result will always be a single-digit number? So you never have to fill a long word with `1010101010...` or something? If so then int->ASCII character is just addition or OR. – Peter Cordes Nov 10 '18 at 19:18
  • I'm not sure, as a hint I have a mod 10. so maybe it's just for shorter words. I think max is 9 uppercase and as many lower as you need: 999999999999 – sswwqqaa Nov 10 '18 at 19:19
  • 1
    well.. `count mod 10` will always produce value in range 0..9, so that one will work with the trivial number->ASCII conversion by doing add/or 0x30. (i.e. for ABCDEFGHIJ it will produce 0000000000) – Ped7g Nov 10 '18 at 19:21
  • Ok, thanks a lot. Now it's clear – sswwqqaa Nov 10 '18 at 19:24
  • Also looking into your code, you are doing this in some MIPS simulator with setting "delayed branching OFF", on real MIPS CPU this would fail due to delayed branching... it helps to specify in SO question which assembler/simulator you use and in this particular case (MIPS platform) also to specify delayed branching setting, as it basically makes whole different platform from real MIPS. (btw hint2 - you don't need to do real `mod`, you can just as well jump to `word_countUppercase` when `t5 < 10` after `++t5`, otherwise reset it to zero (when it did reach 10) and jump unconditionally. – Ped7g Nov 10 '18 at 19:26
  • I'm using MARS simulator – sswwqqaa Nov 10 '18 at 19:35

0 Answers0