Практически ваш код #define DATA_IN P8IN
unsigned short ReadExtMem(void)
{ unsigned short result;
	result= DATA_IN;			
	result<<=8;		
	result+=DATA_IN;		
	return result;
}
void main(void)
{ unsigned short in_word;
  for(;;)
	  in_word = ReadExtMem();
}
компилируется вот так
        NAME test
        RSEG CSTACK:DATA:SORT:NOROOT(0)
        EXTERN ?longjmp_r4
        EXTERN ?longjmp_r5
        EXTERN ?setjmp_r4
        EXTERN ?setjmp_r5
        PUBWEAK ?setjmp_save_r4
        PUBWEAK ?setjmp_save_r5
        PUBLIC ReadExtMem
        PUBWEAK _A_P7IN
        PUBLIC main
        ASEGN DATA16_AN:DATA:NOROOT,038H
// union <unnamed> _A_P7IN
_A_P7IN:
        DS8 2
        RSEG CODE:CODE:REORDER:NOROOT(1)
ReadExtMem:
        MOV.B   &0x39, R12
        SWPB    R12
        MOV.B   &0x39, R15
        ADD.W   R15, R12
        RET
        REQUIRE _A_P7IN
        RSEG CODE:CODE:REORDER:NOROOT(1)
main:
??main_0:
        CALL    #ReadExtMem
        JMP     ??main_0
        RSEG CODE:CODE:REORDER:NOROOT(1)
?setjmp_save_r4:
        REQUIRE ?setjmp_r4
        REQUIRE ?longjmp_r4
        RSEG CODE:CODE:REORDER:NOROOT(1)
?setjmp_save_r5:
        REQUIRE ?setjmp_r5
        REQUIRE ?longjmp_r5
        END
Как вы можете заметить подпрограмма чтения ReadExtMem в пять команд уместилась. Запись в in_word в теле main компилятор выбросил вполне справедливо. Ее значение нигде не используется, а потому в данном примере нафиг не нужно.