"Опыт дизассемблирования большой .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 совершает ошибки, иногда регулярные, а иногда ред- кие, коварные и даже подлые. Самая противная ошибка - случайный пропуск данных- встречается довольно редко. Начнем с того, что встречается очень часто. 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 |
|
|