mips function continued. character and string operations 4/17/2015 week04-3.ppt 2 characters are...
TRANSCRIPT
![Page 1: MIPS Function Continued. Character and String Operations 4/17/2015 week04-3.ppt 2 Characters are encoded as 0’s and 1’s using ASCII most commonly](https://reader035.vdocuments.mx/reader035/viewer/2022062421/56649c7d5503460f9493308b/html5/thumbnails/1.jpg)
MIPS Function Continued
![Page 2: MIPS Function Continued. Character and String Operations 4/17/2015 week04-3.ppt 2 Characters are encoded as 0’s and 1’s using ASCII most commonly](https://reader035.vdocuments.mx/reader035/viewer/2022062421/56649c7d5503460f9493308b/html5/thumbnails/2.jpg)
Character and String Operations
04/18/23week04-3.ppt2
Characters are encoded as 0’s and 1’s using ASCII most commonly American Standard Code for Information
Interchange Each character is represented using 8 bits (or
a byte) MIPS provides instructions to move bytes
Load byte (lb) loads a byte to the rightmost 8 bits of a register
Store byte (sb) write the rightmost 8 bits of a register to memory
![Page 3: MIPS Function Continued. Character and String Operations 4/17/2015 week04-3.ppt 2 Characters are encoded as 0’s and 1’s using ASCII most commonly](https://reader035.vdocuments.mx/reader035/viewer/2022062421/56649c7d5503460f9493308b/html5/thumbnails/3.jpg)
SPIM syscalls
li $v0,1 # print an integer in $a0li $a0,100syscall
li $v0,5 # read an integer into $v0syscall
li $v0,4 # print an ASCIIZ string at $a0la $a0,msg_hellosyscall
li $v0,10 #exitsyscall
![Page 4: MIPS Function Continued. Character and String Operations 4/17/2015 week04-3.ppt 2 Characters are encoded as 0’s and 1’s using ASCII most commonly](https://reader035.vdocuments.mx/reader035/viewer/2022062421/56649c7d5503460f9493308b/html5/thumbnails/4.jpg)
String Copy Procedure
04/18/23week04-3.ppt4
![Page 5: MIPS Function Continued. Character and String Operations 4/17/2015 week04-3.ppt 2 Characters are encoded as 0’s and 1’s using ASCII most commonly](https://reader035.vdocuments.mx/reader035/viewer/2022062421/56649c7d5503460f9493308b/html5/thumbnails/5.jpg)
.datamsg_hello:
.asciiz "Hello! This is CDA3100!\n"
msg_empty: .space 400
.text
.globl mainmain:
li $v0,4la $a0,msg_hellosyscall
li $v0,4la $a0,msg_emptysyscall
la $a0,msg_empty #dstla $a1,msg_hello #srcjal strcpy
li $v0,4la $a0,msg_emptysyscall
li $v0,10 #exitsyscall
strcpy:ori $t0, $a0, 0ori $t1, $a1, 0
strcpyloop:lb $t3, 0($t1)sb $t3, 0($t0)beq $t3, $0, strcpydoneaddi $t0, $t0, 1addi $t1, $t1, 1j strcpyloop
strcpydone:jr $ra
![Page 6: MIPS Function Continued. Character and String Operations 4/17/2015 week04-3.ppt 2 Characters are encoded as 0’s and 1’s using ASCII most commonly](https://reader035.vdocuments.mx/reader035/viewer/2022062421/56649c7d5503460f9493308b/html5/thumbnails/6.jpg)
Stack
Key things to keep in mind: Stack is a software concept – last in first out,
that’s it. In MIPS, you implement the stack by yourself by
keeping $sp always pointing to the top element on the stack
Stack can be used in functions to save register values, and is the standard approach to save register values. But You can also use stack for other purposes This is not the only way to save register values.
![Page 7: MIPS Function Continued. Character and String Operations 4/17/2015 week04-3.ppt 2 Characters are encoded as 0’s and 1’s using ASCII most commonly](https://reader035.vdocuments.mx/reader035/viewer/2022062421/56649c7d5503460f9493308b/html5/thumbnails/7.jpg)
.datamsg: .asciiz "hello world"endl: .asciiz "\n"
.text .globl mainmain:
addi $sp,$sp,-1
sb $0,($sp)
la $t1, msg
L0:lb $t0,($t1)beq $t0,$0, L1sub $sp,$sp,1sb $t0,($sp)add $t1,1j L0
L1:la $t1,msg
L2:lb $t0,($sp)add $sp,$sp,1sb $t0,($t1)beq $t0, $0, L3
add $t1,1j L2
L3:la $a0,msgli $v0,4syscall
la $a0,endlli $v0,4syscall
li $v0,10 #exitsyscall
![Page 8: MIPS Function Continued. Character and String Operations 4/17/2015 week04-3.ppt 2 Characters are encoded as 0’s and 1’s using ASCII most commonly](https://reader035.vdocuments.mx/reader035/viewer/2022062421/56649c7d5503460f9493308b/html5/thumbnails/8.jpg)
Implementing a Recursive Function Suppose we want to implement this in MIPS:
It is a recursive function – a function that calls itself.
It will keep on calling itself, with different parameters, until a terminating condition is met.
![Page 9: MIPS Function Continued. Character and String Operations 4/17/2015 week04-3.ppt 2 Characters are encoded as 0’s and 1’s using ASCII most commonly](https://reader035.vdocuments.mx/reader035/viewer/2022062421/56649c7d5503460f9493308b/html5/thumbnails/9.jpg)
The Recursive Function
• What happens if we call fact(4)?– First time call fact, compare 4 with 1, no less
than 1, call fact again – fact(3).– Second time call fact, compare 3 with 1, no
less than 1, call fact again – fact(2).– Third time call fact, compare 2 with 1, no less
than 1, call fact again – fact(1).– Fourth time call fact, compare 1 with 1, no less
than 1, call fact again – fact(0).– Fifth time call fact, compare 1 with 1, less than
1, return 1.– Return to the time when fact(0) was called
(when calling fact(1)). Multiply 1 with 1, return 1.
– Return to the time when fact(1) was called (when calling fact(2)). Multiply 2 with 1, return 2.
– Return to the time when fact(2) was called (when calling fact(3)). Multiply 3 with 2, return 6.
– Return to the time when fact(3) was called (when calling fact(4)). Multiply 4 with 6, return 24.
![Page 10: MIPS Function Continued. Character and String Operations 4/17/2015 week04-3.ppt 2 Characters are encoded as 0’s and 1’s using ASCII most commonly](https://reader035.vdocuments.mx/reader035/viewer/2022062421/56649c7d5503460f9493308b/html5/thumbnails/10.jpg)
The Recursive Function In MIPS, we say calling a function as going to
the function. So we go to the function over and over again, until the terminating condition is met.
Here, the function is called “fact,” so we will have a line of code inside the fact function:jal fact
![Page 11: MIPS Function Continued. Character and String Operations 4/17/2015 week04-3.ppt 2 Characters are encoded as 0’s and 1’s using ASCII most commonly](https://reader035.vdocuments.mx/reader035/viewer/2022062421/56649c7d5503460f9493308b/html5/thumbnails/11.jpg)
The Recursive Function The parameter should be passed in $a0. In the
C function, every time we call fact, we call with n-1. So, in the MIPS function, before we do “jal fact”, we should have “addi $a0, $a0,-1.”addi $a0, $a0, -1
jal fact
![Page 12: MIPS Function Continued. Character and String Operations 4/17/2015 week04-3.ppt 2 Characters are encoded as 0’s and 1’s using ASCII most commonly](https://reader035.vdocuments.mx/reader035/viewer/2022062421/56649c7d5503460f9493308b/html5/thumbnails/12.jpg)
The Recursive Function After calling fact, we multiply the return result
with n, soaddi $a0, $a0, -1
jal fact
mul $v0, $v0, $a0
![Page 13: MIPS Function Continued. Character and String Operations 4/17/2015 week04-3.ppt 2 Characters are encoded as 0’s and 1’s using ASCII most commonly](https://reader035.vdocuments.mx/reader035/viewer/2022062421/56649c7d5503460f9493308b/html5/thumbnails/13.jpg)
The Recursive Function After multiplying, we return, soaddi $a0, $a0, -1
jal fact
mul $v0, $v0, $a0
jr $ra
![Page 14: MIPS Function Continued. Character and String Operations 4/17/2015 week04-3.ppt 2 Characters are encoded as 0’s and 1’s using ASCII most commonly](https://reader035.vdocuments.mx/reader035/viewer/2022062421/56649c7d5503460f9493308b/html5/thumbnails/14.jpg)
The Recursive Function So, one if else branch is done. The other
branch is slti $t0, $a0, 1
beq $t0, $0, L1
ori $v0, $0, 1
jr $ra
where L1 is where we should go to if n >= 1.
![Page 15: MIPS Function Continued. Character and String Operations 4/17/2015 week04-3.ppt 2 Characters are encoded as 0’s and 1’s using ASCII most commonly](https://reader035.vdocuments.mx/reader035/viewer/2022062421/56649c7d5503460f9493308b/html5/thumbnails/15.jpg)
The Recursive Function
fact:slti $t0, $a0, 1beq $t0, $zero, L1ori $v0, $0, 1jr $ra
L1:addi $a0, $a0, -1jal factmul $v0, $v0, $a0jr $ra
Any problems?
![Page 16: MIPS Function Continued. Character and String Operations 4/17/2015 week04-3.ppt 2 Characters are encoded as 0’s and 1’s using ASCII most commonly](https://reader035.vdocuments.mx/reader035/viewer/2022062421/56649c7d5503460f9493308b/html5/thumbnails/16.jpg)
The Recursive Function
• The problem is that the function will call itself, as we have expected, but it will not return correctly!
• You need to save $ra, because you made another function call inside the function. You should always do so.
• Is this enough?
fact:addi $sp, $sp, -4sw $ra, 0($sp)
slti $t0, $a0, 1beq $t0, $zero, L1ori $v0, $0, 1
lw $ra, 0($sp)addi $sp, $sp, 4
jr $raL1:
addi $a0, $a0, -1jal factmul $v0, $v0, $a0
lw $ra, 0($sp)addi $sp, $sp, 4
jr $ra
![Page 17: MIPS Function Continued. Character and String Operations 4/17/2015 week04-3.ppt 2 Characters are encoded as 0’s and 1’s using ASCII most commonly](https://reader035.vdocuments.mx/reader035/viewer/2022062421/56649c7d5503460f9493308b/html5/thumbnails/17.jpg)
The Recursive Function So now you can return to the main function,
but the return result is 0, why? Because you did not return to the correct
time. Time, here, means what was the parameter
you called fact with. So, should also save $a0!
![Page 18: MIPS Function Continued. Character and String Operations 4/17/2015 week04-3.ppt 2 Characters are encoded as 0’s and 1’s using ASCII most commonly](https://reader035.vdocuments.mx/reader035/viewer/2022062421/56649c7d5503460f9493308b/html5/thumbnails/18.jpg)
The Recursive Function
04/18/23week04-3.ppt18
![Page 19: MIPS Function Continued. Character and String Operations 4/17/2015 week04-3.ppt 2 Characters are encoded as 0’s and 1’s using ASCII most commonly](https://reader035.vdocuments.mx/reader035/viewer/2022062421/56649c7d5503460f9493308b/html5/thumbnails/19.jpg)
The Stack During Recursion
04/18/23week04-3.ppt19
![Page 20: MIPS Function Continued. Character and String Operations 4/17/2015 week04-3.ppt 2 Characters are encoded as 0’s and 1’s using ASCII most commonly](https://reader035.vdocuments.mx/reader035/viewer/2022062421/56649c7d5503460f9493308b/html5/thumbnails/20.jpg)
.data
.text
.globl mainmain:
li $a0, 4jal fact
done:li $v0,10syscall
fact:addi $sp, $sp, -8sw $ra, 4($sp)sw $a0, 0($sp)
slti $t0, $a0, 1beq $t0, $zero, L1ori $v0, $0, 1addi $sp, $sp, 8jr $ra
L1:addi $a0, $a0, -1jal fact
lw $ra, 4($sp)lw $a0, 0($sp)
mul $v0, $v0, $a0addi $sp, $sp, 8jr $ra
![Page 21: MIPS Function Continued. Character and String Operations 4/17/2015 week04-3.ppt 2 Characters are encoded as 0’s and 1’s using ASCII most commonly](https://reader035.vdocuments.mx/reader035/viewer/2022062421/56649c7d5503460f9493308b/html5/thumbnails/21.jpg)
Two other MIPS pointers
• $fp: When you call a C function, the function may declare an array of size 100 like int A[100]. It is on the stack. You would want to access it, but the stack pointer may keep changing, so you need a fixed reference. $fp is the “frame pointer,” which should always point to the first word that is used by this function.
• $gp: the “global pointer.” A reference to access the static data.