Conversion from assembly program to low-level machine language
The first pass can't resolve any forward jumps.  For example:

    cmp r1, 0
    bne label
    add r2, r3, r4

label:
    add r3, r4, r5


On the first pass, when the assembler gets to the bne label instruction, it doesn't know how far the branch needs to jump because it hasn't seen label yet.  On the second pass, it knows where all the branch targets are located and therefore it can go ahead and generate the proper branch/jump instructions at that time.