Передача массива в процедуру - Assembler
Формулировка задачи:
Добрый день. Помогите пожалуйста разобраться с передачей массива в процедуру через регистр. В программе имеется массив Передача его в процедуру производится путем помещения адреса массива в регистр bp
В myProc производится обработка массива в цикле
По моему мнению теперь result должен содержать строку "0123456789", но при выводе строки result в основной программе выводятся лишь пробелы.
result db 10 DUP(?) '$'
lea bp, result call myProc
mov di, 0 mov dl, '0' myLoop: mov BYTE PTR[bp][di], dl inc dl inc di cmp di, 10 jne myLoop
Решение задачи: «Передача массива в процедуру»
textual
Листинг программы
;MASM/TASM .model compact .286 .stack .data result db 10 DUP(?), '$' .code start: mov ax, @data mov ds, ax push ds push offset result call myProc mov dx, offset result mov ah, 9 int 21h xor ax, ax int 16h mov ax, 4C00h int 21h myProc: mov bp, sp les di, dword ptr ss:[bp+2] mov cx, 10 mov al, '0' @l: stosb inc al loop @l ret end start
Объяснение кода листинга программы
В этом коде:
- Передача массива в процедуру - массив передается в процедуру как аргумент, используя стек.
- Создание стека - стек используется для передачи аргументов в процедуру и для хранения локальных переменных.
- Выделение памяти под массив - массив result выделяется в сегменте данных, используя команду .data и размер 10 байт.
- Инициализация сегмента данных - сегмент данных устанавливается в сегмент, используя команду mov ax, @data и mov ds, ax.
- Вызов процедуры - процедура myProc вызывается с помощью команды call myProc.
- Указание на массив в процедуре - в процедуре myProc, массив result доступен через регистр bp, который содержит адрес стека.
- Основной цикл обработки массива - в цикле while, используя команды mov al, '0' и stosb, байты '0' записываются в массив result.
- Возврат из процедуры - процедура myProc завершается с помощью команды ret.
- Вывод массива на экран - массив result выводится на экран с помощью команды mov dx, offset result и int 21h.
- Очистка стека и возврат в основную программу - после выхода из процедуры, стек очищается с помощью команды xor ax, ax и int 16h.
- Завершение программы - программа завершается с помощью команды mov ax, 4C00h и int 21h.