This happens because __GETDS
is placed just after the entrypoint code and is initially detected by IDA as part of the start
function:
cseg01:0001AAD1 push eax
cseg01:0001AAD2 mov eax, 0
cseg01:0001AAD7 mov edx, 0Fh
cseg01:0001AADC call __FiniRtns
cseg01:0001AAE1 pop eax
cseg01:0001AAE2 mov ah, 4Ch ; 'L'
cseg01:0001AAE4 int 21h ; DOS - 2+ - QUIT WITH EXIT CODE (EXIT)
cseg01:0001AAE4 ; AL = exit code
cseg01:0001AAE6 mov eax, eax
cseg01:0001AAE8
cseg01:0001AAE8 __GETDS: ; CODE XREF: __int23_handler+A↓p
cseg01:0001AAE8 ; __int_ctrl_break_handler+A↓p ...
cseg01:0001AAE8 __GETDSStart_:
cseg01:0001AAE8 mov ds, cs:word_1AAF1
cseg01:0001AAF0 retn
cseg01:0001AAF0 start endp
Since the call is to a middle of an existing function, IDA considers it to be non-returning and stops the code flow. The solution is to break start
after the int 21h
call (Set function end, or 'E' key) and create a proper function for __GETDS
itself. Then you will need to reanalyze all call sites (and maybe recreate the functions) so that code flow is properly updated.