 In this example, we're going to be looking for data hazards in this block of code, and seeing how we can alleviate those using no op instructions. So the first thing I want to do is find all of the places where one instruction relies on the results of another one. So for example, we have t0 here and t0 here. So there's an obvious dependency. The next line we're using t1, which requires the results of the previous instruction. So we have another dependency there. Then our add immediate instruction relies on the results of the third load word instruction. Then we have our store word instruction. Store word instruction actually has two dependencies. It has the dependency on t1. It also has a dependency on t2, because that's the piece of data that's going to be stored. Those are all the hazards we have with the registers, but we technically have one more hazard here. Both of these instructions are accessing the data in t1 plus 0. That is the same memory cell. So there's technically a write after read hazard there. We won't have to worry about that, and it is relatively far apart. But it is there. That is technically a dependency. So if I'm going to address these hazards using no op instructions, I'd start with my first instruction, load word number one. Then load word number two depends on the results of that. First load word, so I need to wait. I'm going to have to wait two cycles for the first load word instruction to complete before I can continue running my second load word instruction. Now, my third load word instruction also depends on the results of my second load word instruction. So again, I'm going to have to wait a little bit, two more cycles. Then I can run load word number three. My add immediate instruction also depends on the results of my third load word instruction. So I'm going to wait another two cycles for the results of load word three to be committed back to the registers. My store board instruction depends on the results of the second load word. So I need at least two cycles between load word number two and my store board instruction. I have one, two, three, four, five, six instructions in between those already. So I'm already covered on that dependency. But I also have a dependency between the store board and the add immediate. So I also need two instructions between the add immediate and my store board instruction. So I'll add in two no op instructions to accommodate that dependency. I don't have to worry about this dependency because that's a right after read hazard and we don't have to worry about those. Also, there's clearly been several cycles between load word number three and my store board instruction anyway. My second add immediate instruction in my add instruction don't have any dependencies on the previous code. So I can just run those two instructions immediately. So this is how I'd have to add no op instructions to resolve the dependencies in our five stage pipeline.