"Опыт дизассемблирования большой .com - программы" - читать интересную книгу автора (Крупник А.Б.)Если посмотреть в область со смещениями, близкими к с1с, то там окажется кусок
повисшего кода, который может быть только данными: ....................................... or al,BYTE PTR [bp+di] ;00c14 add WORD PTR [bx+di],ax ;00c16 add BYTE PTR [bx+si],al ;00c18 add BYTE PTR [bx+si],al ;00c1a mov di,1306h ;00c1c add ax,06c0h ;00c1f ...................................... Рис.7 Теперь нужно поискать идентификаторы d00c1c и d00c1e в тексте, выданном диз- ассемблером. Очень быстро можно найти фрагменты типа: mov WORD PTR ds:d00c1c,ax, mov WORD PTR ds:d00c1e,ax. Значит, ошибка дизассемблера состоит в том, что он перепутал данные и команды и на этой почве сделал два неправильных присваивания, equ, попавших в начало подпрограммы s32. Исправления будут заключаться в следующем: 1. Убрать из начала подпрограммы s32 два псевдооператора equ. 2. Переписать коды на рисунке 7 следующим образом: d00c14 db 0a,03,01,01,00,00,00,00 ;00c14 d00c1e db 13,05,0c0,06 ;00c1e В заключение рассмотрим совсем простенький фрагмент кода: ;<01252> s39 proc near d0125d equ 00125dh d0125f equ 00125fh dec bh ;01252 jz b0124f ;01254 ;Jump if equal (ZF=1) xor ah,ah ;01256 shl al,1 ;01258 ;Multiply by 2's rcl ah,1 ;0125a ;CF<--[HI .. LO]<--CF ret ;0125c ;----------------------------------------------------- add BYTE PTR [bx+si],al ;0125d add BYTE PTR [bx+si],al ;0125f s39 endp Укажем без комментариев, что подпрогромма s39 должна выглядеть так: ;<01252> s39 proc near dec bh ;01252 |
|
|