Вывод массива с определенным условием - 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

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

В этом коде представлен калькулятор, который вычисляет квадраты чисел и выводит их на экран. Список действий, которые выполняет код:

  1. Инициализация сегмента данных и кода.
  2. Объявление и заполнение исходного массива.
  3. Цикл, в котором каждое число в массиве возводится в квадрат и записывается в следующую строку матрицы.
  4. Цикл вывода элементов матрицы на экран.
  5. Процедура вывода числа на экран.
  6. Процедура вывода символа на экран.
  7. Завершение программы.

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


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

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

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