Сформировать матрицу (emu8086) - Assembler

Узнай цену своей работы

Формулировка задачи:

Сформировать матрицу порядка n по заданному образцу(Заранее спасибо):

Решение задачи: «Сформировать матрицу (emu8086)»

textual
Листинг программы
@stack  segment para stack
        db      1024 dup(?)
@stack  ends
 
@data   segment
        N       dw      7
        Matrix  dw      100 dup(?)
        Msg     db      'Matrix:', 0Dh, 0Ah, '$'
        CrLf    db      0Dh, 0Ah, '$'
@data   ends
 
@code   segment
        assume  cs:@code, ds:@data, ss:@stack
main    proc
        ;инициализация сегментного регистра данных
        mov     ax,     @data
        mov     ds,     ax
 
        ;
        mov     ah,     09h
        lea     dx,     [Msg]
        int     21h
        ;заполнение матрицы по образцу
        lea     bx,     [Matrix]
        mov     si,     0
        mov     cx,     [N]
        @@FillForI:
                mov     di,     0
                push    cx
                mov     cx,     [N]
                @@FillForJ:
                        mov     dx,     si
                        xor     dx,     di
                        mov     ax,     0
                        sub     ax,     dx
                        mov     ax,     0
                        sbb     ax,     0
                        not     ax
                        and     ax,     si
                        mov     [bx],   ax
                        add     bx,     2
                        call    Show_AX
                        inc     di
                loop    @@FillForJ
                mov     ah,     09h
                lea     dx,     [CrLf]
                int     21h
 
                pop     cx
                inc     si
        loop    @@FillForI
        ;завершение программы
        mov     ax,     4C00h
        int 21h
main    endp
 
; выводит знаковое 16-разрядное число из регистра AX на экран
; входные данные:
; ax - число для отображения
Show_AX proc
        push    ax
        push    bx
        push    cx
        push    dx
        push    si
        push    di
 
        mov     cx,     10      ;основание системы счисления
        xor     di,     di      ; di - кол. цифр в числе
        xor     si,     si      ; si - признак отрицательного числа
        ; если число в ax отрицательное, то
        ;1) напечатать (запомнить в стеке) символ '-'
        ;2) сделать ax положительным
        or      ax,     ax
        jns     @@Conv
        mov     si,     1
 
        neg     ax
 
@@Conv:
        xor     dx,     dx
        div     cx              ; dl = num mod 10
        add     dl,     '0'     ; перевод в символьный формат
        inc     di
        push    dx              ; складываем в стек
        or      ax,     ax
        jnz     @@Conv
        ;если число отрицательное - помещаем символ "-" в строку
        or      si,     si
        jz      @@Positive
        mov     dx,     '-'
        push    dx
        inc     di
@@Positive:
        ; выводим из стека на экран
        ; - сначала пробелы для выравнивания по правому краю
        mov     cx,     8
        sub     cx,     di
        mov     ah,     02h
        mov     dl,     ' '
@@LeftPad:
        int     21h
        loop    @@LeftPad
        ;сохранённые символы цифр
@@Show:
        pop     dx              ; dl = очередной выводимый символ
        mov     ah,     2       ; ah - функция вывода символа на экран
        int     21h
        dec     di              ; повторяем пока di<>0
        jnz     @@Show
 
        pop     di
        pop     si
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
Show_AX endp
 
@code   ends
 
        end     main

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

  1. Код написан на ассемблере для процессора emu8086.
  2. Задачей программы является формирование матрицы.
  3. В сегменте данных определены следующие переменные:
    • N - содержит число 7.
    • Matrix - содержит матрицу размером 100x100, заполненную по образцу.
    • Msg - содержит строку 'Matrix:'.
    • CrLf - содержит строку символов перевода строки '\r\n'.
  4. В сегменте кода определены следующие процедуры:
    • main - основная процедура программы.
    • Show_AX - процедура вывода знакового 16-разрядного числа на экран.
  5. В основной процедуре происходит инициализация сегментного регистра данных, затем выводится сообщение 'Matrix:', после чего происходит заполнение матрицы по образцу.
  6. При заполнении матрицы используется цикл двойной вложенности, который проходит по всем элементам матрицы.
  7. Для каждого элемента матрицы выполняются следующие действия:
    • Содержимое регистра AX (в котором хранится число для отображения) выводится на экран с помощью процедуры Show_AX.
    • Если число в AX отрицательное, то перед выводом на экран добавляется символ '-'.
    • После вывода числа на экран, в стек добавляется символ пробела для выравнивания по правому краю.
  8. После заполнения матрицы программа завершается.
  9. Процедура Show_AX выводит знаковое 16-разрядное число на экран.
    • Если число отрицательное, то перед выводом на экран добавляется символ '-'.
    • Число выводится в виде строки цифр, начиная с самого старшего разряда.
    • Для выравнивания по правому краю перед выводом каждого числа в стек добавляется символ пробела.

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


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

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

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