Addr
   0000000    main:                           # Start of program
   0000100                                    #
   0001000                                    # There would be code 
   0001100                                    #   leading up to this fragment...
   0010000                                    #
   0011100                                    #
   0011000    LP:      slt $t1, $s0, $s1      # $t1 = 1 if $s0 < $s1
   0011100             beq $t1, $zero, ENDLP  #
   0100000                                    #
   0100100                                    #  ...  lots of stuff here
   0101000                                    #
   0101100                                    #
   0110000             j LP                   # jump back to top of LP
   0110100    ENDLP:                          #
   0111000                                    #
   0111100                                    # ... more code follows the loop
   1000000                                    #
   1000100                                    #
| Label | Instruction Address | 
|---|---|
| main | 00...0000000 (0) | 
| LP | 00...0011000 (24) | 
| ENDLP | 00...0110100 (52) | 
The label is replaced with a value computed from the address, rather than the address directly.j LPbecomes the machine code equivalent ofj 24/4
000010 000000...000011024 / 4 = 6beq $t1, $zero, ENDLPbecomes the machine code equivalent ofbeq $t1, $zero, (52-PC)/4
000100 01000 00000 0000000000000101(52-32)/4 = 5
| 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | |||||||||||||||||||||||
| 1000 | 1004 | 1008 | 100C | 1010 | 1014 | 1018 | 101C | 
How would you know where each (label, address) pair starts?
| Ptr to Label Name | Instruction Address | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| 1000 | 
 | 
 | 
        typedef struct
        {
            char * labelName;
            int    address;
        } LabelEntry;
                 | |||||||
| 1008 | 
 | 
 | ||||||||
| 1010 | 
 | 
 | ||||||||
| … | ||||||||||
| … | ||||||||||
| 1410 | 
 | |||||||||
| 1415 | 
 | |||||||||
| 1418 | 
 | |||||||||
| 
 | 
 | 
 | 
 | 
 | 
 | ||||||
| 1000 | 1008 | 1010 | |||||||||
| … | |||||||||||
| … | |||||||||||
| 
 | 
 | 
 | ||||||||||||||||
| 1410 | 1415 | 1418 | 
(The strings might, or might not, be laid out contiguously in memory like this.)