Kinking? Oh, you mean linking! Err, what does a linker do... Well, what you say is not too far from the truth, although traditionally, assemblers are much less involved with linkers than higher languages such as C or C++. A linker's job is to glue together all kinds of separate source files or modules into a single executable file, often adding information in the process. Think of a list of symbols or names for debugging purposes, hints as to whether a section of that file contains data or code, and in what part of memory those sections should be stored. A very important task of the linker is to resolve all so-called cross references: references to variables and functions which are used, but not defined in a source code module. The assembler cannot compute the correct offset itself (it is defined in another file, after all), but the linker can. It keeps track of every location in each and every assembled file where such a reference is made, then computes all the correct offsets and addresses before writing them out to the final executable file.
You can do without a linker if you write all your code into a single file (although some extra information to make the assembled result into an executable would still have to be added) or if you use absolute addresses. The latter is useful in a few rare cases.