"Опыт дизассемблирования большой .com - программы" - читать интересную книгу автора (Крупник А.Б.) ret ;093d4
;----------------------------------------------------- d093d5: ror ah,1 ;093d5 ;LO]-->[HI..LO]-->[HI jb b093da ;093d7 ;Jump if < (no sign) ret ;093d9 b093da: inc si ;093da ret ;093db ............................................................ d08790 db 00,00 ;08790 ...... d08792 dw OFFSET d093d5 ;08792 Здесь я предвижу большие возражения. Мне скажут, что все это можно интер- претировать иначе, что мои доказательства неубедительны и т.д. С этим я со- вершенно согласен. Более того, эти доказательства неубедительны и для меня. Гораздо сильнее убеждает то, что программа после ассемблирования работает! Дизассемблирование, как и отладка программ - процесс интуитивный. Опытный человек испытывает особое удовольствие от того, что его немотивированные догадки впоследствии подтверждаются. Как часто мысль, пришедшая в автобусе, во сне, в компании, в самой неподходящей обстановке - оказывается верной! Завершим этот пункт еще одним достаточно хитрым примером. В тексте, кото- рый выдал дизассемблер, встретился такой фрагмент: mov bx,4f71h ;0522b b0522e: pop ax ;0522e jnz b0522e ;05231 ;Jump not equal(ZF=0) mov BYTE PTR ds:d041f4,00 ;05233 push ax ;05238 ret ;05239 ................................. call s229 ;<04fc4> ;04f71 Возникает все тот же вопрос - что такое 4f71h - число или смещение? Чтобы ответить на этот вопрос, нужно понять, что делает этот участок программы. Давайте попробуем в этом разобраться. Очевидно, из стека выталкивается число, сравнивается с 4f71h и если нет равенства, выталкивается следующее число. Если число равно 4f71h, то оно снова заталкивается в стек и происхо- дит возврат из подпрограммы. Но куда? Ясно, что в то место, смещение кото- рого было в исходной программе равно 4f71h. Как видно из текста, в этом мес- те стоял вызов подпрограммы s229. Значит, таким странным образом вызывается подпрограмма и 4f71h - это смещение! Исправленный фрагмент должен выглядеть так: mov bx, OFFSET d04f71 ;0522b b0522e: pop ax ;0522e cmp ax,bx ;0522f jnz b0522e ;05231 ;Jump not equal(ZF=0) mov BYTE PTR ds:d041f4,00 ;05233 |
|
|