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

83D100 ADC CX,0000 83D100 ADC CX,0000
5F POP DI 5F POP DI
C3 RET C3 RET

Рис.4 Рис.5

Сравнение рисунков 4 и 5 показывает, что логика работы программы меняется в за-
висимости от того, какой ассемблер применялся.
Как выкрутиться из этой ситуации, если нужного ассемблера нет под рукой? Са-
мый простой, но не очень красивый путь - поставить "заплатку". Чтобы можно было
использовать TASM, подпрогроамма s25 должна выглядеть так:

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



ОСОБЕННОСТИ И ОШИБКИ ДИЗАССЕМБЛЕРА DisDoc 2.3



К сожалению, DisDoc 2.3 совершает ошибки, иногда регулярные, а иногда ред-
кие, коварные и даже подлые. Самая противная ошибка - случайный пропуск данных-
встречается довольно редко. Начнем с того, что встречается очень часто.

1. EQU - кто тебя выдумал?

В коде, выданном дизассемблером, часто попадаются такие загадочные куски:

;<00465>
s12 proc near
d0046c equ 00046ch
cmp bx,5ah ;00465

Каков смысл присвоения d0046c equ 00046ch ? Чтобы выяснить это, нужно
отыскать d0046c в тексте. В нашем случае элемент данных d0046c встречается
очень далеко от своего первого появления - в подпрограмме s321

mov ax,0040h ;06257
;
mov es,ax ;0625a
mov al,BYTE PTR es:d0046c ;0625c