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

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

d08790 db 00,00 ;08790 ......
d08792 dw OFFSET d093d5 ;08792

Здесь я предвижу большие возражения. Мне скажут, что все это можно интер-
претировать иначе, что мои доказательства неубедительны и т.д. С этим я со-
вершенно согласен. Более того, эти доказательства неубедительны и для меня.
Гораздо сильнее убеждает то, что программа после ассемблирования работает!
Дизассемблирование, как и отладка программ - процесс интуитивный. Опытный
человек испытывает особое удовольствие от того, что его немотивированные
догадки впоследствии подтверждаются. Как часто мысль, пришедшая в автобусе,
во сне, в компании, в самой неподходящей обстановке - оказывается верной!
Завершим этот пункт еще одним достаточно хитрым примером. В тексте, кото-
рый выдал дизассемблер, встретился такой фрагмент:

mov bx,4f71h ;0522b
b0522e: pop ax ;0522e
cmp ax,bx ;0522f
jnz b0522e ;05231 ;Jump not equal(ZF=0)
mov BYTE PTR ds:d041f4,00 ;05233
push ax ;05238
ret ;05239

.................................
call s229 ;<04fc4> ;04f71

Возникает все тот же вопрос - что такое 4f71h - число или смещение? Чтобы
ответить на этот вопрос, нужно понять, что делает этот участок программы.
Давайте попробуем в этом разобраться. Очевидно, из стека выталкивается
число, сравнивается с 4f71h и если нет равенства, выталкивается следующее
число. Если число равно 4f71h, то оно снова заталкивается в стек и происхо-
дит возврат из подпрограммы. Но куда? Ясно, что в то место, смещение кото-
рого было в исходной программе равно 4f71h. Как видно из текста, в этом мес-
те стоял вызов подпрограммы s229. Значит, таким странным образом вызывается
подпрограмма и 4f71h - это смещение! Исправленный фрагмент должен выглядеть
так:

mov bx, OFFSET d04f71 ;0522b
b0522e: pop ax ;0522e
cmp ax,bx ;0522f
jnz b0522e ;05231 ;Jump not equal(ZF=0)
mov BYTE PTR ds:d041f4,00 ;05233