main 側では longadd() の引数を int と仮定するしかありません。 で、longadd(1, 2) ; と呼び出した場合、 スタックは次のようになります。 (一マス=int, nearコールの場合)
int と long のサイズが違う場合 (実際、MS-C では、int=16bit、long=32bit) longadd()は、
とスタックを解釈してしまうのでまともに動かないのです。