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

ret ;03f69
;-----------------------------------------------------
add BYTE PTR [si],bh ;03f6a
push es ;03f6c
jnz b03f79 ;03f6d ;Jump not equal(ZF=0)


В приведенном фрагменте текста метка b03f6b отсутствует. Между тем эта метка
должна "разрубить" пополам инструкцию add BYTE PTR [si],bh , которая начи-
нается в оригинальной программе, подвергаемой дизассемблированию, со смещения
03f6a. Выход здесь может быть только один - смещению 03f6a соответствует байт
данных, а инструкция начинается со смещения 03f6b. Исправленный фрагмент дол-
жен выглядеть так:

b03f53: cmp al,05 ;03f53
jnz b03f6b ;03f55 ;Jump not equal(ZF=0)
......................................................
ret ;03f69
;-----------------------------------------------------
d03f6a db 0 ;03f6a
b03f6b: cmp al,06h ;03f6b
jnz b03f79 ;03f6d ;Jump not equal(ZF=0)

Путаница между данными и инструкциями возникает довольно часто. SOURSER спосо-
бен выдавать целые метры бессмысленных инструкций. DisDoc 2.3 в этом отношении
ведет себя лучше.


3. Зависимость от транслятора

Программисты на ассемблере склонны пренебрегать правилами хорошего тона, на-
рушать все мыслимые табу, и это создает дополнительные трудности при дизас-
семблировании. В качестве примера приведем фрагмент кода, выданного дизассем-
блером

s25 proc near
inc cx ;0086b
add di,bp ;0086c
adc si,00 ;0086e
add dx,si ;00871
push di ;00873
shl di,1 ;00874 ;Multiply by 2's
adc dx,00 ;00876
pop di ;00879
ret ;0087a

Этот фрагмент представляется совершенно невинным, и действительно, он дизас-
семблирован правильно. Вся беда в том, что программист задумал изменять этот
фрагмент, то есть резать по живому. Оказывается, в программе есть еще такой
кусок