Строки исходного кода в память - 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 (?)
Объяснение кода листинга программы
call copy
— осуществляет вызов функцииcopy
.s db 'Hello World!',0
— в этой строке переменнойs
присваивается значение 'Hello World!' и добавляет ноль, чтобы указать на завершение строки.STRLEN = $-s
— здесь переменнойSTRLEN
присваивается значение, равное разнице между адресом строкиs
и адресом буфера.copy:
— это метка функции, которая связывает список команд с определенным местом в коде.pop si
— в этой команде с регистраsi
считывается значение и вычитается единица. Это делается для получения адреса строки.lea di,buf
— здесь регистрdi
связывается с адресом буфера.mov cx,STRLEN
— в этой команде переменнойcx
присваивается значение переменнойSTRLEN
.cld
— это команда, которая устанавливает флаг направления в 1, что означает, что данные будут читаться из памяти.rep movsb
— это команда, которая повторяет чтение данных из памяти и записывание их в буфер до тех пор, пока не будет встречен ноль.buf db STRLEN dup (?)
— в этой строке создается буфер, который будет содержать строку. ЗдесьSTRLEN
дублируется столько раз, сколько требуется для заполнения буфера, а знак вопроса означает, что этот символ будет заменен на ноль.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д