"Опыт дизассемблирования большой .com - программы" - читать интересную книгу автора (Крупник А.Б.)регистр si используется для косвенной адресации. Значит, исправленный фрагмент
должен выглядеть следующим образом: mov ax,bx ;1 shl ax,1 ;004bc ;2 mov si,OFFSET d08429 ;3 add si,ax ;4 push WORD PTR [si] ;5 ................................ d08429 db 0ff,0ff,0f6 ;8429 db 0ff,0d8,0ff,0a6,0ff,60 ;0842c .....` Возможно, здесь у многих возникнет сомнение - нужно ли заменять число на со- ответствующий OFFSET - ведь, казалось бы, в заново ассемблированной программе данные будут иметь то же смещение? К сожалению, это не так. Во первых, мы,как правило, не знаем, какой ассемблер применялся при транслировании оригинального текста, а коды, полученные с помощью разных ассемблеров будут иметь разную дли- ну, что приведет к изменению смещений. Например, команда AND CX,0007h трансли- руется MASMом 5.1 и TASMом 1.01 как 83E107 и занимает 3 байтa. Но эта же ко- манда может быть транслирована как 81E10700 и занимать 4 байта. Во-вторых, даже если смещение сохранится, программа не поддастся модификации, так как при вставке какого-либо фрагмента кода изменятся смещения и все "развалится". Итак, OFFSETы позволяют склеить программу, делают ее пригодной для модификации. ные ситуации и первым делом исследуем фрагмент текста, выданный дизассемблером: mov bx,9006h ;08f66 b08f75: mov WORD PTR ds:d087d0,bx ;08f75 ................................. call WORD PTR cs:d087d0 ;08fc3 ...................................... ;----------------------------------------------------- push dx ;09006 call s419 ;<099a3> ;09007 mov al,BYTE PTR [si] ;0900a mov BYTE PTR [si],0ffh ;0900c pop dx ;0900f ret ;09010 ;----------------------------------------------------- Здесь возникает тот-же вопрос - что такое 9006h в первой строчке фрагмента - смещение или просто число? Ответить на этот вопрос помогает информация, по- мещенная дизассемблером в поле комментариев. Мы уже говорили о том что числа, помещенные в этом поле, представляют собой смещения, которые имела инструкция в исходной программе, подвергаемой дизассемблированию. Нетрудно догадаться, что в приведенном фрагменте осуществляется косвенный вызов подпрограммы, и, следо- вательно, 9006h - это смещение, а не число. Фрагмент должен быть исправлен так: |
|
|