You don't want to be quite so crude in splitting the program into separate assembler source files. As an example, conditional jumps to near locations only take 2 bytes while to far locations they take 6 bytes. For jumps to locations in other files the assembler will have to use the long form. Thus you are pretty much forced to do some kind of intelligent splitting (perhaps at a top-level function boundary).