Ever wonder why return codes are usually multiples of 4? Well if so (and even if not), here’s the answer.
On IBM mainframes, return code handling after calling a sub routine in assembler is typically done using a branch table that is indexed into using the value in a register (usually 15), so you’d get something like this:
CALL SUBRTN CALL A SUB ROUTINE B NEXT(R15) BRANCH INTO TABLE INDEXED BY R15 NEXT B OK RC=0, OK B RC4 RC=4, WARNING B RC8 RC=8, ERROR B RC12 RC=12, REAL BAD ERROR B RC16 RC=16, QUIT
So why the multiple of 4?
Branch instructions to a label such as B OK as shown above occupy 4 bytes. The B NEXT(15) branches to the label NEXT + whatever is in R15, so when R15 contains zero, it branches to the first branch instruction that then branches to the label RC0. When R15 contains four, it branches to the second branch instruction (label next + 4) that then branches to the label RC4 and so on with each increasing return code representing a more sever error.
To keep the branch tables short, return codes were typically limited to zero through sixteen, thus giving 4 ‘error’ return codes in addition to zero (OK).
Obviously, if the sub routine returned with any other return code such as 2 for example, you would end up branching into some address other than a valid branch instruction with who knows what result!
So, now you know.