Обнулить одномерный массив - 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, которая, вероятно, завершает работу программы. Вот список действий, которые выполняются в этом коде:

  1. Код размещается в двух сегментах: fir и two.
  2. Инициализируются переменные fir и two.
  3. Переменная len инициализируется как сумма всех элементов массива s_s.
  4. Задаются начальные значения для регистров ax, ds и es.
  5. Регистр di устанавливается в начало массива s_s.
  6. Выполняется цикл, который проходит по всем элементам массива.
  7. Каждый элемент выводится на экран с помощью функции OutInt.
  8. После вывода всех элементов выполняется команда int 16h, которая, вероятно, завершает работу программы. В функции OutInt выполняются следующие действия:
  9. Выполняется тест на ноль регистра ax. Если он не равен нулю, то выполняется следующая последовательность действий:
    • Регистр di устанавливается в 1.
    • Регистр ax инвертируется.
    • Выполняется цикл, который проходит по всем цифрам числа, представленного в регистре ax.
      • Каждая цифра выводится на экран с помощью команды int 21h.
      • Регистр cx инвертируется.
    • Если регистр cx не равен нулю, то выполняется команда int 21h, которая выводит дефис на экран.
  10. Если регистр ax равен нулю, то выполняется команда int 21h, которая выводит дефис на экран.
  11. Возвращается управление в вызывающую программу.

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


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

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

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