Заполнить память копиями самой программы - Assembler
Формулировка задачи:
Помогите пожалуйста. Нужно срочно сдать промежуточный экзамен по Архитектуре ЭВМ. Пишем программы на линуксе. Задание звучит так:
Используя синтаксис ассемблера nasm для процессора Intel 80x86 написать код, заполняющий память компьютера, начиная с адреса, следующего непосредственно за последней командой этой программы , копиями самой программы. Всего записать 20 копий программы. Программа должна располагаться с адреса 100h и не использовать память младших адресов.
Очень срочно нужно. Через 2 часа нужно сдать((((((
Решение задачи: «Заполнить память копиями самой программы»
textual
Листинг программы
org 100h start: mov bx,20 ; счётчик копий mov di,finish ; приёмник @@: ; push finish ; pop cx ; СХ = длина кода dec ch ; ..без PSP mov si,100h ; источник rep movsb ; копируем из SI в DI dec bx ; счётчик -1 jnz @b ; работаем 20 раз ret ; на выход! finish: ; адрес конца программы
Объяснение кода листинга программы
Орг. код:
- Переменная bx используется как счётчик копий.
- Переменная di используется как приёмник.
- Финальная точка.
- Переменная cx используется как счётчик.
- Переменная ch используется как счётчик без PSP.
- Переменная si используется как источник.
- Команда rep movsb используется для копирования из источника в приёмник.
- Декаем счётчик bx.
- Если bx больше нуля, то выполняем цикл.
- Выходим из программы. Код:
- mov bx,20 — счётчик копий = 20
- mov di,finish — приёмник = finish
- push finish — копируем адрес finis в стек
- pop cx — из стека в cx копируем длинну кода
- dec ch — уменьшаем на единицу счётчик без PSP
- mov si,100h — источник = 100h
- rep movsb — копируем из источника в приёмник
- dec bx — уменьшаем на единицу счётчик копий
- jnz @b — если bx больше нуля, то выполняем цикл
- ret — на выход!
- finish: — адрес конца программы