"Опыт дизассемблирования большой .com - программы" - читать интересную книгу автора (Крупник А.Б.) push ax ;05238
ret ;05239 ................................. d04f71: call s229 ;<04fc4> ;04f71 2.Как отличить данные от команд? Любой дизассемблер путает данные и команды. Особенно это относится к .COM программам, где все перемешано. Рассмотрим простой пример: pop cx ;03e56 ret ;03e57 ;----------------------------------------------------- add BYTE PTR [bx+si],al ;03e58 add BYTE PTR [bx+si],al ;03e5a m03e5c: mov BYTE PTR ds:d05830,01 ;03e5c В этом фрагменте встретились две вычурных, повисших инструкции: add BYTE PTR [bx+si],al ;03e58 add BYTE PTR [bx+si],al ;03e5a кой m03e5c. Ясно, что эти инструкции могут быть только данными. После передел- ки приведенный фрагмент должен выглядеть так: pop cx ;03e56 ret ;03e57 ;----------------------------------------------------- d03e58 dw 0 ;03e58 d03e5a db 0 ;03e5a d03e5b db 0 m03e5c: mov BYTE PTR ds:d05830,01 ;03e5c Тут возникает еще один вопрос: почему в одном случае стоит dw, а в другом - db? Ответ содержится в тексте, который выдал дизассемблер. Там можно найти такие инструкции: mov si,WORD PTR ds:d03e58 ;03dd0 mov bl,BYTE PTR ds:d03e5a ;03dd4, откуда следует, что d03e58 рассматривается как слово, а d03e5a - как байт. Рассмотрим чуть более сложный, но, тем не менее, очень характерный пример. b03f53: cmp al,05 ;03f53 jnz b03f6b ;03f55 ;Jump not equal(ZF=0) ..................................................... |
|
|