While the lab machines do not have a 16-bit C compiler, the 16-bit C calling convention is still very useful when writing 16-bit assembly programs for passing arguments via the stack. While passing arguments in registers may appear to be significantly easier at first glance, as the complexity and number of function arguments increases, the stack is a much better choice for passing arguments. Using the stack also makes procedures easier to write as more registers are free for general use.
Most of the above discussion on the 32-bit C calling convention can be easily translated into 16-bits by using 16-bit registers instead of 32-bit and adjusting offsets accordingly. For example, SP and BP should be used instead of ESP and EBP respectively in Section 8.2.1.2 and the first and second arguments in Section 8.2.1.4 are at [BP+4] and [BP+6].
However, in a multi-segment 16-bit program, addresses and references are still 32-bit: a 16-bit segment and a 16-bit offset. When multiple code segments are used, FAR CALL must be used instead of CALL, which offsets stack parameters by an additional 2 bytes because of CS being pushed on the stack (also, RETF must be used instead of RET).
While 8-bit and 16-bit values are still returned in AL and AX in the 16-bit C calling convention, 32-bit values must be split into two 16-bit chunks. The high-order portion is returned in DX and the low-order portion is returned in AX.