Как работает программа? Не могу разобраться - 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
Объяснение кода листинга программы
Список элементов кода:
- CSEG segment - сегмент данных
- assume cs:CSEG, es:CSEG, ds:CSEG, ss:CSEG - директива сегментации
- org 100h - начальный адрес программы
- Begin: - метка начала программы
- mov sp,offset Lab_1 - перемещение указателя стека на начало процедуры Lab_1
- MOV DX, 8000 - установка регистра DX на 8000
- XOR CX, CX - установка регистра CX на 0
- DELAY_LOOP: - метка цикла задержки
- LOOP DELAY_LOOP - команда перехода к метке DELAY_LOOP
- DEC DX - уменьшение значения регистра DX на 1
- JNZ DELAY_LOOP - команда перехода к метке DELAY_LOOP, если DX не равен нулю
- mov ax,9090h - установка регистра AX на 9090h
- push ax - отправка регистра AX на стек
- int 20h - вызов прерывания 20h (вывод строки)
- Lab_1: - метка начала процедуры Lab_1
- mov ah,9 - установка регистра AH на 9 (код функции вывода символа)
- mov dx,offset Mess - установка регистра DX на адрес строки Mess
- int 21h - вызов прерывания 21h (вывод символа)
- int 20h - вызов прерывания 20h (вывод строки)
- Mess db 'А все-таки она выводится! $' - определение строки Mess (включая символ доллара и знак переноса строки)
Пояснение к коду:
- Переменные SP и BX используются для работы со стеком. SP указывает на верх стека, а BX используется для передачи аргументов в процедуры.
- Цикл DELAY_LOOP используется для задержки выполнения программы на некоторое время. Он продолжает выполняться до тех пор, пока значение регистра DX не станет равным 0.
- Вызовы прерываний 20h и 21h используются для вывода символов и строк на экран.
- Строка Mess выводится на экран дважды: сначала с помощью функции вывода символа (код 9), а затем с помощью функции вывода строки (код 20).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д