Передача массива в процедуру - Assembler

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

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

Добрый день. Помогите пожалуйста разобраться с передачей массива в процедуру через регистр. В программе имеется массив
result db 10 DUP(?) '$'
Передача его в процедуру производится путем помещения адреса массива в регистр bp
lea bp, result
call myProc
В myProc производится обработка массива в цикле
mov di, 0
mov dl, '0'
myLoop: mov BYTE PTR[bp][di], dl
inc dl
inc di
cmp di, 10
jne myLoop
По моему мнению теперь result должен содержать строку "0123456789", но при выводе строки result в основной программе выводятся лишь пробелы.

Решение задачи: «Передача массива в процедуру»

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

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

В этом коде:

  1. Передача массива в процедуру - массив передается в процедуру как аргумент, используя стек.
  2. Создание стека - стек используется для передачи аргументов в процедуру и для хранения локальных переменных.
  3. Выделение памяти под массив - массив result выделяется в сегменте данных, используя команду .data и размер 10 байт.
  4. Инициализация сегмента данных - сегмент данных устанавливается в сегмент, используя команду mov ax, @data и mov ds, ax.
  5. Вызов процедуры - процедура myProc вызывается с помощью команды call myProc.
  6. Указание на массив в процедуре - в процедуре myProc, массив result доступен через регистр bp, который содержит адрес стека.
  7. Основной цикл обработки массива - в цикле while, используя команды mov al, '0' и stosb, байты '0' записываются в массив result.
  8. Возврат из процедуры - процедура myProc завершается с помощью команды ret.
  9. Вывод массива на экран - массив result выводится на экран с помощью команды mov dx, offset result и int 21h.
  10. Очистка стека и возврат в основную программу - после выхода из процедуры, стек очищается с помощью команды xor ax, ax и int 16h.
  11. Завершение программы - программа завершается с помощью команды mov ax, 4C00h и int 21h.

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

10   голосов , оценка 3.9 из 5