# # program to get a line of text from user and count digits in it # .text .globl main main: # # opening linkage (save return address) # addi $sp, $sp, -4 sw $ra, 0($sp) # # prompt # la $a0, prompt li $v0, 4 # "print string" syscall syscall # # get input # la $a0, input li $a1, 100 li $v0, 8 # "read string" syscall syscall # # echo # la $a0, echo li $v0, 4 # "print string" syscall syscall la $a0, input li $v0, 4 syscall # # count digits # # in C-like pseudocode: # char *p = string; # count = 0; # while (*p != '\0') { # if (isdigit(*p)) count += 1; # ++p; # } # # $s0 for p # $s1 for count la $s0, input addi $s1, $zero, 0 # loop mainloop: lb $t0, 0($s0) beq $t0, $zero, endloop # if *p < '0', not a digit slti $t1, $t0, '0' bne $t1, $zero, notdigit # if '9' < *p, not a digit addi $t2, $zero, '9' slt $t1, $t2, $t0 bne $t1, $zero, notdigit # digit! increment count addi $s1, $s1, 1 notdigit: # increment pointer addi $s0, $s0, 1 j mainloop endloop: la $a0, msg li $v0, 4 # "print string" syscall syscall addi $a0, $s1, 0 # get saved result (input) li $v0, 1 # "print int" syscall syscall la $a0, nl li $v0, 4 # "print string" syscall syscall # # closing linkage (get return address and restore stack pointer) # lw $ra, 0($sp) addi $sp, $sp, 4 jr $ra .end main # # area for variables and constants # .data prompt: .asciiz "Enter a line of text:\n" echo: .asciiz "You entered:\n" msg: .asciiz "Result " nl: .asciiz "\n" input: .space 100