Вывод массива с определенным условием - Assembler
Формулировка задачи:
Есть массив, где две строчки и десять столбцов. Первая строка состоит из чисел, кратных пяти, а вторая, возводит их в квадрат, соответственно.
т.е.
5 10 15
10 100 225
И так далее, до 50.
Что в итоге получается снизу, первая строка заполняется по условиям, а вот со второй возникают проблемы. Или отдельно для нее писать циклы, или как-то нужно перепрыгивать со второй строчки наверх, а потом опять вниз, возводя в квадрат.. в этом возникла проблема.
.model small .stack 100h .386 ;Разрешение трансляции команд процессора 386 .data mas db 100 dup (0) ;исходный массив .code start: mov ax, @data mov ds, ax mov ax, 0 ;обнуление ax mov cx, 20 ;значение счетчика цикла mov al, 1 ; счётчик для значений массива mov si, 0 ;индекс начального элемента в cx go: ;цикл инициализации mov mas[si], al ;запись в массив inc al ;увеличение значения следуещего элемента массива на 1 inc si ;переход к следующему элементу loop go ;повторить цикл mov si, 0 ;переход к 1-му элементу mov cx, 1 ;ето строчки show1: ;цикл вывода элементов массива на экран push cx mov cx, 10 ;ето столбцы количество их show2: mov al, mas[si] ;значение элемента массива ;помещается в AL mov ah, 0 ;AH = 0 imul ax,5 call print ; вызов функции вывода числа в AX на экран inc si ;переход к следующему элементу loop show2 pop cx mov dl, 0DDh ;переход на следующую строку call pr mov dl, 0DAh call pr show3: mov cx, 10 mov si,4 show4: mov al, mas[si] ;значение элемента массива ;помещается в AL mov ah, 0 ;AH = 0 mul ax call print ; вызов функции вывода числа в AX на экран inc si ;переход к следующему элементу loop show4 mov ax,4C00h ;завершение программы int 21h print proc ;процедура для вывода элеманта массива на экран pusha ;вывод пробелов перед каждым числом pusha mov bx, 0 label0: inc bx mov dx, 0 mov cx, 10 div cx cmp ax, 1 jnc label0 neg bx add bx, 6 mov cx, bx lab: mov dl, 0D0h call pr loop lab popa ;вывод символа на экран mov cx, 0 label1: mov dx, 0 mov bx, 10 ;Заносим основание системы счисления, равное 10, в регистр BX div bx ;деление AX на BX mov bx, 0 push dx inc cx cmp ax, 0 ;сравнение AX с нулём jnz label1 ;если условие выполняется, то переход на метку label1 label2: pop dx call pr ;вывод на экран символа inc bx loop label2 ;повторение с метки label2, пока значение CX не станет равно нулю popa ret print endp pr proc ;процедура, выводящая символ на экран mov ah, 02h add dl, 30h int 21h ret pr endp end start
Решение задачи: «Вывод массива с определенным условием»
textual
Листинг программы
.model small .stack 100h .386 ;Разрешение трансляции команд процессора 386 .data mas dw 2*10 dup (0) ;исходный массив .code start: mov ax, @data mov ds, ax mov ax, 0 ;обнуление ax mov cx, 10 ;значение счетчика цикла mov ax, 5 ; счётчик для значений массива mov si, 0 ;индекс начального элемента в cx mov bx, 2*10 ;смещение на следующую строку массива go: ;цикл инициализации mov mas[si], ax ;запись в массив push ax push dx mul ax ;возведение числа в квадрат mov mas[si+bx], ax ;сохранение квадрата числа во второй строке матрицы pop dx pop ax add ax, 5 ;увеличение значения следуещего элемента массива на 5 add si, 2 ;переход к следующему элементу loop go ;повторить цикл mov si, 0 ;переход к 1-му элементу mov cx, 2 ;ето строчки show1: ;цикл вывода элементов массива на экран push cx mov cx, 10 ;ето столбцы количество их show2: mov ax, mas[si] ;значение элемента массива ;помещается в AX call print ; вызов функции вывода числа в AX на экран add si, 2 ;переход к следующему элементу loop show2 pop cx mov dl, 0Dh-30h ;переход на следующую строку call pr mov dl, 0Ah-30h call pr loop show1 mov ax,4C00h ;завершение программы int 21h print proc ;процедура для вывода элеманта массива на экран pusha ;вывод пробелов перед каждым числом pusha mov bx, 0 label0: inc bx mov dx, 0 mov cx, 10 div cx cmp ax, 1 jnc label0 neg bx add bx, 6 mov cx, bx lab: mov dl, 0D0h call pr loop lab popa ;вывод символа на экран mov cx, 0 label1: mov dx, 0 mov bx, 10 ;Заносим основание системы счисления, равное 10, в регистр BX div bx ;деление AX на BX mov bx, 0 push dx inc cx cmp ax, 0 ;сравнение AX с нулём jnz label1 ;если условие выполняется, то переход на метку label1 label2: pop dx call pr ;вывод на экран символа inc bx loop label2 ;повторение с метки label2, пока значение CX не станет равно нулю popa ret print endp pr proc ;процедура, выводящая символ на экран mov ah, 02h add dl, 30h int 21h ret pr endp end start
Объяснение кода листинга программы
В этом коде представлен калькулятор, который вычисляет квадраты чисел и выводит их на экран. Список действий, которые выполняет код:
- Инициализация сегмента данных и кода.
- Объявление и заполнение исходного массива.
- Цикл, в котором каждое число в массиве возводится в квадрат и записывается в следующую строку матрицы.
- Цикл вывода элементов матрицы на экран.
- Процедура вывода числа на экран.
- Процедура вывода символа на экран.
- Завершение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д