Обнулить одномерный массив - Assembler
Формулировка задачи:
Приветствую, только недавно начал изучать столь случайную и непредсказуемую (по крайней мере пока) вещь как ассемблер, которая пока не поддается объяснению. Задача состоит в том, чтобы задать массив байтов натуральных чисел, вывести его на экран. Потом, со следующей строки вывести этот же массив, все элементы которого заменены на 0.
В этом и вопрос, создать и вывести массив удалось, как перейти на следующую строку в командной строке и заменить значения массива?
пытался использовать rep stosb, но с выводом тогда потом какие-то проблемы и каша из символов
two segment s_s db 1,2,3,9,9,9,3,4,2,2 two ends fir segment assume cs:fir begin_: mov ax,two mov cx,10 mov ds,ax lea si,s_s lop: mov ah,2h mov dl,[si] add dl,'0' int 21h mov ah,2h mov dl,' ' int 21h inc si loop lop int 21h mov ax,4c00h int 21h fir ends end begin_
Решение задачи: «Обнулить одномерный массив»
textual
Листинг программы
two segment s_s db 1,2,3,9,9,9,3,4,2,2 len=$-s_s two ends fir segment assume cs:fir begin_: mov ax,two mov ds,ax mov es, ax lea di,s_s mov si, di mov cx, len push cx xor ax, ax rep stosb ;обнуление pop cx lop: mov al, [si] call OutInt mov al, ' ' int 29h inc si loop lop xor ax, ax int 16h mov ax,4c00h int 21h OutInt proc push ax push dx push bx push cx push di test ax, ax jns oi1 mov di, 1 neg ax oi1: xor cx, cx mov bx, 10 oi2: xor dx, dx div bx add dx, '0' push dx inc cx test ax, ax jne oi2 mov ah, 2 cmp di, 1 jne oi3 mov dl, '-' int 21h oi3: pop dx int 21h loop oi3 pop di pop cx pop bx pop dx pop ax ret OutInt endp fir ends end begin_
Объяснение кода листинга программы
В этом коде нет непосредственного обнуления массива, но есть вызов функции OutInt, которая выводит каждый элемент массива в отдельной строке с добавлением пробела в конце. После вывода всех элементов массива выполняется команда int 16h, которая, вероятно, завершает работу программы. Вот список действий, которые выполняются в этом коде:
- Код размещается в двух сегментах: fir и two.
- Инициализируются переменные fir и two.
- Переменная len инициализируется как сумма всех элементов массива s_s.
- Задаются начальные значения для регистров ax, ds и es.
- Регистр di устанавливается в начало массива s_s.
- Выполняется цикл, который проходит по всем элементам массива.
- Каждый элемент выводится на экран с помощью функции OutInt.
- После вывода всех элементов выполняется команда int 16h, которая, вероятно, завершает работу программы. В функции OutInt выполняются следующие действия:
- Выполняется тест на ноль регистра ax. Если он не равен нулю, то выполняется следующая последовательность действий:
- Регистр di устанавливается в 1.
- Регистр ax инвертируется.
- Выполняется цикл, который проходит по всем цифрам числа, представленного в регистре ax.
- Каждая цифра выводится на экран с помощью команды int 21h.
- Регистр cx инвертируется.
- Если регистр cx не равен нулю, то выполняется команда int 21h, которая выводит дефис на экран.
- Если регистр ax равен нулю, то выполняется команда int 21h, которая выводит дефис на экран.
- Возвращается управление в вызывающую программу.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д