In MIPS, while using a jump instruction, we use a label.
again: nop
$j again
So when we reach the jump instruction, we use the label again
to show where to go and the value of the actual address there is used. I wanted to know where the label again is stored. Meaning, say nop
is stored at 0x00400000, and the jump instruction is at 0x00400004. Where, then is again
kept, how does MIPS know again
is pointing to 0x00400000? Is it stored in the Dynamic Data area of the memory map? This is the memory map I've been provided for MIPS
I've also included the question which caused this confusion below, for reference.
Give the object code in hexadecimal for the following branch (be, bne) and jump (j) instructions.
... # some other instructions
again: add ... # there is an instruction here and meaning is insignificant
add ... # likewise for the other similar cases
beq $t0, $t1, next
bne $t0, $t1, again
add ...
add ...
add ...
next: j again
Assume that the label again is located at memory location 0x10 01 00 20. If you think that you do not have enough information to generate the code explain.
Each label corresponds to a unique address in memory. So in your example, and in agreement with what you stated, if the nop
instruction exists at 0x00400000 then again
will correspond (not point--more on that in a second) to that same address.
Labels can exist in both the text and data segments. However, in your example the label is shown in the .text:
segment. So, it represent the address of an instruction as opposed to a variable.
Here's the important distinction:
Labels are a part of most ISAs to make writing assembly easier for humans. However, it's important to remember that assembly is not the final form of code. In other words, in the binary representation your label won't be much of a label anymore.
So, this is what will happen:
The assembler will recognize the memory address associated with each label's instruction. Let's keep our running example of 0x00400000. Then, in each jump instruction it will take this address and use it to replace the label in the opcode. Poof, no more labels and definitely no pointers (which would imply we would have another place in memory that is storing a memory address).
Of course, the memory address itself corresponds to a spot in the text segment in your example because it matches to an instruction.
Simply stated, labels exist to make our lives easier. However, once they're assembled they're converted to the actual memory address of the instruction/variable that they've labeled.