Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2016, 11:30   #1
Hunter___321
Новичок
Джуниор
 
Регистрация: 14.12.2016
Сообщений: 1
По умолчанию Транспонирование матрицы и суммирование с исходной

Квадратная матрица чисел из диапазона 0..9999 размерностью [1..N; 1..N] вводится с клавиатуры по строкам, где N — число из диапазона 1..9, вводимое с клавиатуры . Вывести на экран результат сложения введенной матрицы с транспонированной введенной матрицей.
Программа должна быть написана на языке Ассемблера(tasm).
Есть наработки, но проблема со считыванием и выводом, а так же нужно реализовать суммирование
Код:
.model  small
.186
.code
begin:
;Адресуем сегментные регистры
        mov ax,@data
        mov ds,ax
        mov es,ax
            mov ah, 01h
    int 21h
    cmp al, 0dh     ;проверка   окончания ввода по Enter
    je label1
    xor ah, ah
    sub al, '0'
    mov n, ax
    label1:
    call ReadArray ;считываем массив во второй
;Выводим исходную матрицу
        ;call   OutMatrix
;Транспонируем матрицу
        call    TranspMatrix
;Выводим полученный результат
        call    OutMatrix
;Ожидаем любую клавишу и завершаем программу
        xor ax,ax
        int 16h
        mov ax,4c00h
        int 21h
;
ReadArray proc near
    mov cx, n
    fl2:
        push cx
        mov bx, cx
        neg bx
        add bx, n;индекс строки
        mov i, bl
        mov cx, n
            fl3:
                push cx
                mov bl, i;номер строки
                neg cx
                add cx, n ;номер столбца
                mov ax, n
                mul bl
                add ax, cx
                mov si, ax ;индекс смещения
                ;первый символ
                mov cx, 4
                fl5:
                    mov ah, 01h
                    int 21h
                    cmp al, 20h
                    je fl4; если пробел, то выходим
                    sub al, '0'
                    mov dl, al
                loop fl5
                xor ah, ah
                push ax
                mov al, 10
                mul dl
                mov dx, ax
                pop ax
                add dx, ax ;в dx введенное число
                fl4:
                    mov matrix[si], dl
                    mov dl, 20h ;разделяем пробелами
                    mov ah, 02h
                    int 21h
                    pop cx
            loop fl3
                pop cx
                mov dl, 10 ;переводим на новую строку
                mov ah, 2h
                int 21h
                mov dl, 13 ;возвращаем каретку
                mov ah, 2h
                int 21h
    loop fl2
        mov dl, 10
        mov ah, 2h
        int 21h
        mov dl, 13
        mov ah, 2h
        int 21h
        ret
ReadArray endp
;Вывод матрицы
;устанавливаем внешний индекс цикла
OutMatrix:  mov cx,4
;сбрасываем указатель в матрице
        xor si,si
;запоминаем его в стеке
OM1:        push    cx
;устанавливаем внутренний индекс цикла
        mov cx,4
;считываем значение числа
OM2:        mov al,[Matrix+si]
;переходим к следующему числу
        inc si
;выводим число на экран
        call    OutNumber
;проверяем внутренний цикл
        loop    OM2
;переходим на новую строку
        call    NewLine
;востанавливаем внешний индекс цикла
        pop cx
;проверяем внешний индекс цикла
        loop    OM1
;переходим на новую строку
NewLine:    mov al,10
        int 29h
        mov al,13
        int 29h
;возвращаемся из под програмы
        ret
;
;Выводим одно число в АХ
;запоминаем счетчик цикла в стеке
OutNumber:  push    cx
;система счисления, в данном случае 10-ая
        mov bx,10
;сбрасываем старшую часть слова
        xor ah,ah
;сбрасываем счетчик цифр
        xor cx,cx
;сбрасываем остаток
ON1:        xor dx,dx
;длелим на систему счисления и получаем остаток от деления
        div bx
;запоминаем остаток в стеке
        push    dx
;считаем запомненую цифру
        inc cx
;посторяем пока АХ больше нуля
        or  ax,ax
        jnz ON1
;форматируем вывод чисел
;значение, которое при +30Н даст код пробела
        mov ax,-10h
;увеличиваем счетчик цифр в стеке
ON2:        inc cx
;запоминаем в стеке условный код пробела
        push    ax
;повторяем пока в стеке не будет 4-е цифры
        cmp cx,4
        jnz ON2
;выводим число на экран
;извлекаем из стека очередную цифру
ON3:        pop ax
;переводим в символьный код для вывода на экран
        add al,30h
;выводим на экран символ
        int 29h
;повторяем пока в стеке есть цифры
        loop    ON3
;востанавливаем счетчик цикла
        pop cx
        ret
;
;трнспонируем матрицу
;устанавливаем индекс внешнего цикла
TranspMatrix:
    xor bx,bx   ;база строки
    xor si,si   ;смещение элемента в строке
    xor di,di   ;смещение транспонированного элемента
TM1:            ;цикл по строкам верхнего треугольника
    push    si  ;сохраним индекс в строке
    push    di  ;сохраним смещение транспонированного элемента
TM2:            ;цикл по элементам строки верхнего треугольника
    inc si  ;диагональный элемент обходим
    add di,N    ;аналогично для второго элемента
    cmp si,N    ;дошли до края строки?
    je  TM3 ;да - переходим на следующую
 
;обмениваем элементы
    mov al,[Matrix+bx+si]
    xchg    [Matrix+di],al
    mov [Matrix+bx+si],al
 
    jmp TM2 ;на слеующий элемент в строке
TM3:            ;переход на следующую строку
    pop di  ;восстановим индексы
    pop si
    add bx, N   ;переходим на слеующую строку
    inc si  ;и смещаемся на одну позицию вправо 
            ;(рассматриваем только верхний треугольник)
    add di, N+1 ;смещаемся на одну строку вниз и на одну позицию вправо
            ;(соответствующая позиция в нижнем треугольнике)
    cmp bx, 4 ;дошли до последней строки?
    jne TM1 ;нет - на отраотку строки
    ret
;сегмент данных
.data
Matrix      db  81 dup (?)
    array2 db 16 dup (?)
    arrayResult dw 16 dup (0)
    i db 1 dup (0)
    j db 1 dup (0)
    a db 1 dup (0)
    b db 1 dup (0)
        n dw ? ;размерность
;сегмент стека
.stack  100h
;точка входа в программу
end begin
Hunter___321 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Транспонирование матрицы. oleg866 Помощь студентам 3 11.05.2014 01:21
c++ транспонирование матрицы Niklitel Помощь студентам 13 30.10.2013 10:26
Транспонирование матрицы Stasiksis Общие вопросы C/C++ 3 24.09.2011 17:11
Транспонирование матрицы Tatum Паскаль, Turbo Pascal, PascalABC.NET 1 15.03.2011 19:32
Программа создания матрицы из исходной по заданному алгоритму milton Паскаль, Turbo Pascal, PascalABC.NET 4 23.11.2008 14:54