Заполнить память копиями самой программы - 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:                ; адрес конца программы

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

Орг. код:

  1. Переменная bx используется как счётчик копий.
  2. Переменная di используется как приёмник.
  3. Финальная точка.
  4. Переменная cx используется как счётчик.
  5. Переменная ch используется как счётчик без PSP.
  6. Переменная si используется как источник.
  7. Команда rep movsb используется для копирования из источника в приёмник.
  8. Декаем счётчик bx.
  9. Если bx больше нуля, то выполняем цикл.
  10. Выходим из программы. Код:
  11. mov bx,20 — счётчик копий = 20
  12. mov di,finish — приёмник = finish
  13. push finish — копируем адрес finis в стек
  14. pop cx — из стека в cx копируем длинну кода
  15. dec ch — уменьшаем на единицу счётчик без PSP
  16. mov si,100h — источник = 100h
  17. rep movsb — копируем из источника в приёмник
  18. dec bx — уменьшаем на единицу счётчик копий
  19. jnz @b — если bx больше нуля, то выполняем цикл
  20. ret — на выход!
  21. finish: — адрес конца программы

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

11   голосов , оценка 4.182 из 5