 Making function calls in assembly language is actually pretty simple. And we'll have multiple steps that we have to go through to accomplish this. But the actual process is not that hard. In a high level language, we might just have something like a equals function of parentheses b comma c. That would be all we'd need to write to all function with a couple of parameters and store its results into another variable. In this case, though, we're going to have to set up all of those pieces separately. First, we'll have to get the values of b and c. And we're going to put them into registers. In this case, we're going to put those into, say, registers a0 and a1. If I have more parameters, I can put them in a2 or a3. If I have less, I wouldn't use a1. If I don't have any parameters, then I just don't use any of the argument registers at all. The one additional complication would be if I have lots and lots of parameters, something more than four, in which case I would actually put those in some unallocated part of the stack, then the first thing my function would do would be to allocate that memory so it can see those registers. But we tend to try not to write functions that have that many arguments to begin with, so you probably won't need to worry about that case. Instead, we'll start our function call by just making sure all of our arguments are in the argument registers. You'll need to make sure that where you put each piece of data, matches up with what the function expects. So rather like a function would expect a certain piece of data to be in the first slot, a different piece of data to be in the second slot, assembly language, our functions will expect a certain piece of data to be in a0, and a different piece of data to be in a1. It won't work well if you reverse those slots. It also won't work well if you just put that data into some arbitrary register. Then you actually make the function call, and that's where the jump and link instruction comes in at. Jump and link will tell the machine to go to this line of code, start running from there. Which line of code? Well, that's given by the function name. You basically tell the machine that I want to go run this code and the end link part tells the machine that I also want to set the return address register to be the value of whatever my next instruction is. This way, my function will know that when it completes, it should go back to this line of code and start running from there. The jump and link instruction is what will actually do our function call for us. Once the function is completed, it will return and we'll start running this next line of code. And that's where we get to use those results that the function computed for us. And in this case, we're going to expect that any of those results have been returned in v0 and v1. If you only have one return value, then you would expect it to be in v0. If you've got a 64 bit return value, then it would stretch over v0 and v1. But we could potentially return two 32 bit values from our function as well.