Строки исходного кода в память - Assembler

Узнай цену своей работы

Формулировка задачи:

Возможно ли извлекать из адреса строки? К примеру извлечь строку кода из адреса который находится в регистре EIP и поместить в память?

Решение задачи: «Строки исходного кода в память»

textual
Листинг программы
  call copy
s db 'Hello World!',0
STRLEN = $-s
copy:
  pop si  ; адрес строки
  lea di,buf  ; адрес буфера
  mov cx,STRLEN
  cld
  rep movsb  ; копируем
. . .
buf db STRLEN dup (?)

Объяснение кода листинга программы

  1. call copy — осуществляет вызов функции copy.
  2. s db 'Hello World!',0 — в этой строке переменной s присваивается значение 'Hello World!' и добавляет ноль, чтобы указать на завершение строки.
  3. STRLEN = $-s — здесь переменной STRLEN присваивается значение, равное разнице между адресом строки s и адресом буфера.
  4. copy: — это метка функции, которая связывает список команд с определенным местом в коде.
  5. pop si — в этой команде с регистра si считывается значение и вычитается единица. Это делается для получения адреса строки.
  6. lea di,buf — здесь регистр di связывается с адресом буфера.
  7. mov cx,STRLEN — в этой команде переменной cx присваивается значение переменной STRLEN.
  8. cld — это команда, которая устанавливает флаг направления в 1, что означает, что данные будут читаться из памяти.
  9. rep movsb — это команда, которая повторяет чтение данных из памяти и записывание их в буфер до тех пор, пока не будет встречен ноль.
  10. buf db STRLEN dup (?) — в этой строке создается буфер, который будет содержать строку. Здесь STRLEN дублируется столько раз, сколько требуется для заполнения буфера, а знак вопроса означает, что этот символ будет заменен на ноль.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4 из 5
Похожие ответы