"Опыт дизассемблирования большой .com - программы" - читать интересную книгу автора (Крупник А.Б.)

mov bx,OFFSET d09006 ;08f66
......................................
;-----------------------------------------------------
d09006: push dx ;09006
......................................
ret ;09010

Рассмотрим еще один пример косвенного вызова подпрограммы, в котором
OFFSET попадает в область данных.

s390 proc near
..........................................................
mov ax,WORD PTR [bx+8792h] ;092c7
mov WORD PTR ds:d087d2,ax ;092cb
...........................................................
call WORD PTR cs:d087d2 ;093c8
ret ;093d4
;-----------------------------------------------------
ror ah,1 ;093d5 ;LO]-->[HI..LO]-->[HI
jb b093da ;093d7 ;Jump if < (no sign)
ret ;093d9
b093da: inc si ;093da
ret ;093db
............................................................

Чтобы выяснить, что представляет собой 8792h, нужно посмотреть в область
со смещениями, близкими к этому числу. Приведем соответствующий фрагмент, вы-
данный дизассемблером:

d08790 db 00,00,0d5,93 ;08790 ......
.............................................................

Видно, что смещению 08792 соответствует слово 0d5,93. Теперь остается заметить,
что со смещения 093d5 в исходной программе начинается фрагмент повисшего кода

ror ah,1 ;093d5 !!!!!! ;LO]-->[HI..LO]-->[HI
jb b093da ;093d7 ;Jump if < (no sign)
ret ;093d9
b093da: inc si ;093da
ret ;093db

Следовательно,весь разобранный пример - это хитроумный косвенный вызов под-
программы. Исправленный фрагмент должен выглядеть так:

s390 proc near
..........................................................
mov ax,WORD PTR [bx+OFFSET d08792] ;092c7
mov WORD PTR ds:d087d2,ax ;092cb
...........................................................
call WORD PTR cs:d087d2 ;093c8