Вывод массива с определенным условием - 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
Объяснение кода листинга программы
В этом коде представлен калькулятор, который вычисляет квадраты чисел и выводит их на экран. Список действий, которые выполняет код:
- Инициализация сегмента данных и кода.
- Объявление и заполнение исходного массива.
- Цикл, в котором каждое число в массиве возводится в квадрат и записывается в следующую строку матрицы.
- Цикл вывода элементов матрицы на экран.
- Процедура вывода числа на экран.
- Процедура вывода символа на экран.
- Завершение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д