Как работает программа? Не могу разобраться - Assembler

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

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

Здравствуйте! Изучать ассемблер я начал изучать совсем недавно. Для начала изучаю программирование под ms-dos(masm 6.11) по книге Олега Калашникова "Ассемблер - это просто". Там он привел пример "хитрой" программы и объяснение по её работе из которого я понял вроде что-то, но как-то расплывчато. А в таких фундаментальных вещах хотелось бы понять и изучить всё досконально. Я вроде понял, что заталкивая в стэк 9090h, мы даем процессору две команды nop. И за счет них как-то пропускается int 20h. Но как именно это выходит, что-то не совсем ясно. Отладчик показывает какую-то фигню, т.к. (опять же с объяснений автора) отладчики юзают стэк нашей программы и перемещая(в первой строке) sp мы перемещаем и данные отладчика. Помогите, пожалуйста, разжуйте дураку, поподробнее. Вот код:
CSEG segment
assume cs:CSEG, es:CSEG, ds:CSEG, ss:CSEG
org 100h
Begin:
   mov sp,offset Lab_1
   mov ax,9090h
   push ax
   int 20h
Lab_1:
   mov ah,9
   mov dx,offset Mess
   int 21h
   int 20h
Mess db 'А все-таки она выводится! $'
CSEG ends
end Begin

Решение задачи: «Как работает программа? Не могу разобраться»

textual
Листинг программы
CSEG segment
assume cs:CSEG, es:CSEG, ds:CSEG, ss:CSEG
org 100h
Begin:
   mov sp,offset Lab_1
; --------------------
   MOV   DX, 8000
   XOR   CX, CX
DELAY_LOOP:
   LOOP  DELAY_LOOP
   DEC   DX
   JNZ   DELAY_LOOP
; --------------------
   mov ax,9090h
   push ax
   int 20h
Lab_1:
   mov ah,9
   mov dx,offset Mess
   int 21h
   int 20h
Mess db 'А все-таки она выводится! $'
CSEG ends
end Begin

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

Список элементов кода:

  1. CSEG segment - сегмент данных
  2. assume cs:CSEG, es:CSEG, ds:CSEG, ss:CSEG - директива сегментации
  3. org 100h - начальный адрес программы
  4. Begin: - метка начала программы
  5. mov sp,offset Lab_1 - перемещение указателя стека на начало процедуры Lab_1
  6. MOV DX, 8000 - установка регистра DX на 8000
  7. XOR CX, CX - установка регистра CX на 0
  8. DELAY_LOOP: - метка цикла задержки
  9. LOOP DELAY_LOOP - команда перехода к метке DELAY_LOOP
  10. DEC DX - уменьшение значения регистра DX на 1
  11. JNZ DELAY_LOOP - команда перехода к метке DELAY_LOOP, если DX не равен нулю
  12. mov ax,9090h - установка регистра AX на 9090h
  13. push ax - отправка регистра AX на стек
  14. int 20h - вызов прерывания 20h (вывод строки)
  15. Lab_1: - метка начала процедуры Lab_1
  16. mov ah,9 - установка регистра AH на 9 (код функции вывода символа)
  17. mov dx,offset Mess - установка регистра DX на адрес строки Mess
  18. int 21h - вызов прерывания 21h (вывод символа)
  19. int 20h - вызов прерывания 20h (вывод строки)
  20. Mess db 'А все-таки она выводится! $' - определение строки Mess (включая символ доллара и знак переноса строки) Пояснение к коду:
    • Переменные SP и BX используются для работы со стеком. SP указывает на верх стека, а BX используется для передачи аргументов в процедуры.
    • Цикл DELAY_LOOP используется для задержки выполнения программы на некоторое время. Он продолжает выполняться до тех пор, пока значение регистра DX не станет равным 0.
    • Вызовы прерываний 20h и 21h используются для вывода символов и строк на экран.
    • Строка Mess выводится на экран дважды: сначала с помощью функции вывода символа (код 9), а затем с помощью функции вывода строки (код 20).

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


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

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

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