The first time you call mysql_fetch_array() i fetches the first row in the result set and then moves the cursor to the next row. The second call will return the second row etc, until you've fetched the last row in the set. When the last row is fetched the next call to mysql_fetch_array() will return FALSE and thus break the loop.
If you want to display the rows from the bottom up you'd better rewrite your SQL query so that the result set is reversed. If you insist on letting PHP handle this, which I don't recommend, you could find out how many rows there are in the result set with mysql_num_rows() and then use mysql_result().