"Опыт дизассемблирования большой .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 - это смещение, а не число. Фрагмент должен быть исправлен
так: