sprintf: addi $sp, $sp, -16 sw $s0, 0($sp) #$s0 will char at $a0[i] sw $s1, 4($sp) #$s1 will hold wich argument we deal with sw $s2, 8($sp) #mini stack pointer sw $s3, 12($sp) #which are to use add $s3, $0, $0 add $v0, $0, $0 loop: lb $s0, 0($a1) beqz $s0, end beq $s0, '%', format #if ($s0 == '%') goto format; #handle normal charecters. sb $s0, 0($a0) #if the charecter is not % than we simply addi $a0, $a0, 1 #put in the new string and incriment $a0 addi $a1, $a1, 1 #incriment $a1 to point to next char in string addi $v0, $v0, 1 #incriment output char count b loop #handle other parts of the string format: bne $s3, $0, use_a3 use_a2: add $s1, $a2, $0 b continue_format use_a3: add $s1, $a3, $0 continue_format: addi $s3, $s3, 1 addi $a1, $a1, 1 #a1 gets next place in string lb $s0, 0($a1) #load charecter after the % addi $a1, $a1, 1 #incriment $a1 past the format char beq $s0, 'x', hex beq $s0, 'd', decimal_integer beq $s0, 'c', char beq $s0, 's', string percent: addi $t0, $0, '%' sb $t0, 0($a0) addi $a0, $a0, 1 addi $v0, $v0, 1 b loop decimal_integer: bgez $s1, posative negative: addi $t0, $0, '-' sb $t0, 0($a0) addi $a0, $a0, 1 addi $v0, $v0, 1 neg $s1,$s1 posative: rem $t0, $s1, 10 addi $t0, $t0, 48 addi $sp, $sp, -1 addi $s2, $s2, -1 sb $t0, 0($sp) div $s1, $s1, 10 bne $s1, $0, posative integer_output: beqz $s2, loop lb $t0, 0($sp) sb $t0, 0($a0) addi $sp, $sp, 1 addi $s2, $s2, 1 addi $a0, $a0, 1 addi $v0, $v0, 1 b integer_output hex: addi $t0, $0, '0' sb $t0, 0($a0) addi $t0, $0, 'x' sb $t0, 1($a0) addi $a0, $a0, 2 bgez $s1, posative_hex negative_hex: addi $t0, $0, '-' sb $t0, 0($a0) addi $a0, $a0, 1 addi $v0, $v0, 1 neg $s1,$s1 posative_hex: rem $t0, $s1, 16 blt $t0, 10, number letter: addi $t0, $t0, 39 number: addi $t0, $t0, 48 addi $sp, $sp, -1 addi $s2, $s2, -1 sb $t0, 0($sp) div $s1, $s1, 16 bne $s1, $0, posative_hex hex_output: beqz $s2, loop lb $t0, 0($sp) sb $t0, 0($a0) addi $sp, $sp, 1 addi $s2, $s2, 1 addi $a0, $a0, 1 addi $v0, $v0, 1 b hex_output char: sb $s1, 0($a0) addi $a0, $a0, 1 addi $v0, $v0, 1 b loop string: add $t1, $s1, $0 string_loop: lb $t0,0($t1) beqz $t0,loop sb $t0,0($a0) addi $a0, $a0, 1 addi $v0, $v0, 1 addi $t1,$t1,1 b string_loop end: sb $0, 0($a0) #add null charecter lw $s3, 12($sp) lw $s2, 8($sp) lw $s1, 4($sp) #pop $s1 back off lw $s0, 0($sp) #pop $s0 back off addi $sp, $sp, 16 #update stack (4*2) jr $ra #return to calling function