"Опыт дизассемблирования большой .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

Сверху они ограничены инструкцией возврата из подпрограммы ret, а снизу - мет-
кой 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)
.....................................................