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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.07.2017, 21:19   #1
HellSteelMan
 
Регистрация: 24.07.2017
Сообщений: 3
По умолчанию Обработка двухмерного массива в Assembler

Написать программу обработки квадратной матрицы A размерности (nxn). Размерность и элементы матрицы вводятся с клавиатуры, результаты выводятся на экран.

Получить новую матрицу путем умножения всех элементов первоначальной на наименьший положительный элемент матрицы.


Цитата:
Код:
[модуль vvod.asm]
public vvod
resh  segment para public 'data'
mes   db 'Переполнение'
mes1  db '',10,13,'$'
mes2  db 'Ошибка ввода',10,13,'$'
resh  ends
bukw  segment para public 'code'
      assume cs:bukw,ds:resh
vvod  proc near
      mov ax,resh
      mov ds,ax
      push ax
      push cx
      push dx
      push si
      push di
      push bp
      maska=00001111b
      mov bx,0
      mov cx,10
      mov si,0
      mov di,1
      mov bp,1
met4: mov ax,0800h
      int 21h
      cmp al,0dh
      je met1
      cmp si,0
      jne met2
      cmp al,2dh
      jne met3
      mov dl,2dh
      mov di,0
met6: mov ax,0200h
      int 21h
      mov si,1
      mov bp,0
      jmp met4
met3: cmp al,2bh
      jne met2
      mov dl,2bh
      jmp met6
met2: cmp al,30h
      jae met5
met7: mov dl,07h
      mov ax,0200h
      int 21h
      jmp met4
met5: cmp al,39h
      ja met7
      mov dl,al
      mov ax,0200h
      int 21h
      mov bp,1
      mov si,1
      and al,maska
      cbw
      push ax
      mov ax,bx
      cwd
      imul cx
      jo met11
      mov bx,ax
      pop ax
      cmp di,1
      je met9
      neg ax
met9: add bx,ax
      jno met4
met11:lea dx,mes1
      mov ax,0900h
      int 21h
      lea dx,mes
      mov ax,0900h
      int 21h
      jmp stop
met1: cmp bp,1
      je met10
      lea dx,mes1
      mov ax,0900h
      int 21h
      lea dx,mes2
      mov ax,0900h
      int 21h
      jmp stop
met10:lea dx,mes1
      mov ax,0900h
      int 21h
stop: pop bp
      pop di
      pop si
      pop dx
      pop cx
      pop ax
      ret
vvod  endp
bukw ends
      end
Цитата:
Код:
[модуль disp.asm]
;внешняя процедура вывода двоичного числа
;которое находится в регистре AX на экран
public disp
resh segment para public 'data'
tab db 20 dup(?)
resh ends
bukw segment para public 'code'
        assume cs:bukw,ds:resh
Disp    proc near
        push bx
        push si
        push cx
        push ax
Maska equ 00110000B
        mov si,0
        mov bx,10
        mov cx,0
        cmp ax,0
        jge metka
        mov tab[si],'-'
        inc si
        neg ax
metka:  cwd
        div bx
        or dl,maska
        mov tab[si],dl
        inc cx
        inc si
        cmp ax,0
        jne metka
        dec si
        pop ax
        cmp ax,0
        jge metka1
        mov dl,tab
        mov ax,200h
        int 21h
metka1: mov dl,tab[si]
        mov ax,200h
        int 21h
        dec si
        loop metka1
        pop cx
        pop si
        pop bx
        ret
disp endp
bukw ends
end

Цитата:
Код:
[у меня есть такой код]
extrn vvod:near, disp:near
resh segment para public 'data' ; Горенков ПоЗ-11
mas dw 10 dup (?)
mas2 dw 10 dup (?)
n dw ?
min dw ?
minindx dw ?
imin db ?
jmin db ?
mes1 db 'Vvedite n=$'
mes3 db 'mas[$'
mes4 db ',$'
mes5 db ']=$'
mes6 db 'Isxodniy massiv$'
mes7 db 10,13,'$' ; переход на новую строку
mes8 db '_$' ; пробел
mes9 db 'Noviy massiv$'
mes10 db 'Minimal pologitelniy elements $'
mes11 db 'Poziciya minimalnogo elementa, stroka = $'
mes12 db 'Poziciya minimalnogo elementa, stolbez = $'
resh ends
op segment para stack 'stack'
db 100h dup (?)
op ends
bukw segment para public 'code'
osn proc near
assume cs:bukw, ds:resh, ss:op;
        mov ax,resh
        mov ds,ax
        ; ввод вектора
        ; очистка экрана
        mov ax,0002h
        int 10h
        ; ввод размерности массива =n*n
        lea dx,mes1
        mov ax,0900h
        int 21h
        call vvod
        mov n,bx
        ; ввод элементов вектора
        mov cx,n ;число для внешнего цикла по строкам
        mov si,0 ;строки в матрице
	mov bx, offset mas ;строки в матрице (смещение
	;адреса переменной внутри сегмента)
zikl_i:
	push cx ;сохраняем содержимое р-ра cx в стеке
	mov cx,n ;число для внутреннего цикла
		 ;(по столбцам)
	mov di,0 ;столбцы в матрице
zikl_j:
        lea dx,mes3 ; вывод mas[
        mov ax,0900h
        int 21h
        mov ax,si
        call disp
	lea dx,mes4 ; ,
	mov ax,0900h
        int 21h
	mov ax,di
	call disp
        lea dx,mes5 ; вывод ]=
        mov ax,0900h
        int 21h
	push bx
        call vvod
	mov dx,bx
	pop bx
	mov mas[bx][di],dx
	inc di
	loop zikl_j
	pop cx
	add bx,n ;увеличиваем на кол-во эл-тов в строке
	inc si
	loop zikl_i
	;вывод элементов массива
	lea dx,mes6 ;исходная матрица
	mov ax,0900h
	int 21h
	lea dx,mes7 ;перевод курсора на начало строки
        mov ax,0900h
        int 21h
	mov cx,n ;число для внешнего цикла по строкам
	mov si,0 ;строки в матрице
	mov bx,offset mas ;строки в матрице (смещение
		;адреса переменной внутри сегмента)
zikl_i1:
	push cx ;сохраняем содержимое р-ра сx в стеке
	mov cx,n ;число для внутреннего цикла
		 ;(по столбцам)
	mov di,0 ;столбцы в матрице
zikl_j1:
	
   	mov ax,4c00h ;завершение программы 
	int 21h
osn endp
bukw ends
end osn

что делать дальше не знаю

Последний раз редактировалось HellSteelMan; 24.07.2017 в 21:45.
HellSteelMan вне форума Ответить с цитированием
Старый 25.07.2017, 06:57   #2
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от HellSteelMan Посмотреть сообщение
что делать дальше не знаю
Если ввод\вывод работает, то искать минимальный положительный элемент.
Для этого, можно или вручную тестить старший бит числа, или-же проверять флаг(SF).

Вспомни "Таблицу условных переходов", где литер(N) втиснутый по-середине, просто обращает условие на противоположное. Литер(E) в конце, уточняет условие и означает равно. Например: JBE - это "ниже или равно", а JNG - "не больше":

Цитата:
Код:
==================  П Е Р Е Х О Д Ы ====================
+----------------+-----------------+-------------------+
|   Символьный   |    Знаковый     |    По-флагам      |
+----------------+-----------------+-------------------+
|   JB - ниже    |   JL - меньше   |   JS - знак(-)    |
|   JE - равно   |   JZ - ноль     |   JC - перенос    |
|   JA - выше    |   JG - больше   |   JP - чётный     |
+----------------+-----------------+-------------------+
Для поиска мин\положительного можно использовать такой алгоритм.. Если заведомо известно, что в массиве имеются положительные числа, то логично было-бы поместить МАКС\положительное в регистр(ВХ) и сравнивать его с массивом.

Но положительных чисел в массиве может и не быть (если все числа отрицательные). Поэтому правильней будет сначала найти первый положительный элемент, а потом уже его сравнивать со-всеми\остальными. В примере ниже - первый вариант, т.к. он лучше демонстрирует логику (массивы у тебя что-то маленькие 5х2):
Код:
;fasm-code 
;----------
.data
mas   dw  10 dup(?)
mas2  dw  10 dup(?)
;----------------------

.code
;...
     mov   si,mas     ; адрес источника для LODSW
     mov   cx,10      ; длина массива
     mov   bx,127     ; макс.положительное размером в байт

@00: lodsw            ; берём в АХ очередной элемент из DS:SI
     or    ax,ax      ; проверяем его на знак
     js    @01        ; перейти, если отрицательное (см.таблицу выше)
     cmp   bx,ax      ; иначе: сравнить с ВХ
     jle   @01        ; перейти, если ВХ меньше-равно
     xchg  ax,bx      ; иначе: обменять содержимое регистров
@01: loop  @00        ; повторить СХ-раз..

                      ; ВХ - минимальное положительное!
На финише, тебе остаётся все элементы массива(MAS) умножить на регистр(ВХ), записывая произведения в 'MAS2'. И ввод-вывод у тебя никуда не годный - добрую\половину можно отсеить за ненадобностью. ИМХО..
Нашедшего выход - затаптывают первым..

Последний раз редактировалось R71MT; 25.07.2017 в 07:00.
R71MT вне форума Ответить с цитированием
Старый 25.07.2017, 20:47   #3
HellSteelMan
 
Регистрация: 24.07.2017
Сообщений: 3
По умолчанию

Про ввод-вывод скажу так, что нам так сказали сделать... По образцу.
А как всё это будет выглядит в итоге? Подскажите?

Последний раз редактировалось HellSteelMan; 25.07.2017 в 21:01.
HellSteelMan вне форума Ответить с цитированием
Старый 25.07.2017, 20:59   #4
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от HellSteelMan Посмотреть сообщение
как вы это нашли?
это не я нашёл, а инженеры Intel определили. Старший бит байта характеризует знак:
Код:
1111 1111 - макс. без знака
0111 1111 - макс. со знаком
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 26.07.2017, 21:41   #5
HellSteelMan
 
Регистрация: 24.07.2017
Сообщений: 3
По умолчанию

Супер в ноуте Intel, в пк - AMD. вот и пиши программу.
HellSteelMan вне форума Ответить с цитированием
Старый 27.07.2017, 05:40   #6
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

причём здесь Intel или AMD ??? Это закон для любого процессора x32\64
Перед тем как писать программы, нужно хоть азы выучить.
Почитай про дополнительный код..
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перемешивание двухмерного массива stenl1 Общие вопросы C/C++ 10 22.11.2016 06:26
Обработка части двухмерного массива(в Паскале) Андрей77777 Помощь студентам 0 27.11.2012 21:14
Заполнение двухмерного массива _PrizraK_ Общие вопросы Delphi 1 01.05.2011 14:23
перестановка строк двухмерного массива imperceptible4462 Помощь студентам 4 10.09.2010 13:04