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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.03.2013, 08:53   #1
bloodykz
Пользователь
 
Аватар для bloodykz
 
Регистрация: 15.02.2012
Сообщений: 19
По умолчанию Транспонирование матрицы

Нашел код ,исправил для emu8086 и выдает :this interrupt is not defined yet,it is available for custom functions.You can define this interrupt by modifying interrupt vector table refer to the list of supported interrupts and glodal memory table.
Код:
.model small
.code
begin:
;Адресуем сегментные регистры
		mov	ax,data
		mov	ds,ax
		mov	es,ax
;Выводим исходную матрицу
		call	OutMatrix
;Транспонируем матрицу
		call	TranspMatrix
;Выводим полученный результат
		call	OutMatrix
;Ожидаем любую клавишу и завершаем программу
		xor	ax,ax
		int	16h
		mov	ax,4c00h
		int	21h
;
;Вывод матрицы
;устанавливаем внешний индекс цикла
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:	mov	cx,4
;сбрасываем указатель в матрице
		xor	si,si
;сохраняем индекс внешнего цикла
TM1:		xchg	dx,cx
;устанавливаем индекс внутреннего цикла
		mov	cx,4
;проверяем индексы циклов
TM2:		cmp	cx,dx
;если внешний больше или равен внутреннему пропускаем
		jbe	TM3
;транспонируем указатель на элемент матрицы - строку
		mov	di,si
;получаем младшие биты
		and	di,03h
;умножаем их на 4-е
		shl	di,2
;транспонируем указатель на элемент матрицы - столбец
		mov	ax,si
;делим на 4-е
		shr	ax,2
;суммируем новое транспонированное значение указателя
		add	di,ax
;читаем число из матрицы
		mov	al,[Matrix+si]
;обмениваем его с числом по транспонированному адресу указателя
		xchg	[Matrix+di],al
;записываем транспонированное значение
		mov	[Matrix+si],al
;следующий элемент матрицы
TM3:		inc	si
;проверяем индекс внутреннего цикла
		loop	TM2
;востанавливаем значение индекса внешнего цикла
		xchg	dx,cx
;проверяем индекс внешнего цикла
		loop	TM1
;выход из подпрограммы
		ret
;сегмент данных
data segment
Matrix		db	01,02,03,04
		db	05,06,07,08
		db	09,10,11,12
		db	13,14,15,16
data ends
;сегмент стека
org	100h
;точка входа в программу
end	begin
bloodykz вне форума Ответить с цитированием
Старый 04.03.2013, 09:34   #2
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

bloodykz,
ему8086 -- жалкая пародия на компилятор и отладчик, в твоем asm-файле ему не нравится int 29h, поэтому замени строки с int 29h на
Код:
mov ah,2
mov dl,al
int 21h
Mikl___ вне форума Ответить с цитированием
Старый 04.03.2013, 10:07   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Код:
begin:
;Адресуем сегментные регистры
		mov	ax,data
		mov	ds,ax
странно... не знал, что так можно! У меня tasm матерится, требует, чтобы было:
Код:
		mov	ax,@data
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.03.2013, 10:16   #4
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Serge_Bliznykov,
это же emu8086, руки бы выдрал автору по самые плечи, но судя по количеству заданий связанных с этим "емулятором" преподаватели на него "подсели", не понимаю, чего их так в крайности кидает, то пишут программы при помощи debug.exe, то программируют на КР580 (intel8080/8085) где нет команд деления и умножения, то с ДОСом никак не могут проститься
Mikl___ вне форума Ответить с цитированием
Старый 04.03.2013, 10:18   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Mikl___
это же emu8086, руки бы выдрал автору по самые плечи
а может, он его и не руками совсем писал! Или руки у него не из плеч растут...

Ну, в общем, я понял, Mikl___, спасибо за ответ!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.03.2013, 10:43   #6
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Проще всего транспонировать матрицу по дополнительной диагонали - задача сводится к обмену первой и последней ячеек памяти и сдвигать указатели на обмениваемые ячейки к центру массива.

Код:
mass db 3 dup (1)
       db 3 dup (2)
       db 3 dup (3)
...
mov si, offset mass
mov di, offset mass + 9 
lp:
mov al, [si]
mov ah, ds:[di]
mov [si], ah
mov [di], al
inc si
dec di
cmp si,di
jl lp
примерно вот так.
Правильно поставленная задача - три четверти решения.

Последний раз редактировалось DiemonStar; 04.03.2013 в 10:50.
DiemonStar вне форума Ответить с цитированием
Старый 04.03.2013, 11:24   #7
bloodykz
Пользователь
 
Аватар для bloodykz
 
Регистрация: 15.02.2012
Сообщений: 19
По умолчанию

Emu дал преподаватель. Спасибо, исправил. Работает. Можно еще 1 вопрос?
как называется такой метод когда нужно сформировать матрицу вида ,симметричность матрицы? Оо
1,2,3,4
2,3,4,1
3,4,1,2
4,1,2,3
bloodykz вне форума Ответить с цитированием
Старый 04.03.2013, 11:44   #8
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

bloodykz
набери в викепедии в поисковой строке "Матрицы", "симметричность матрицы"
Mikl___ вне форума Ответить с цитированием
Старый 04.03.2013, 11:55   #9
bloodykz
Пользователь
 
Аватар для bloodykz
 
Регистрация: 15.02.2012
Сообщений: 19
По умолчанию

Хорошо.Погуглил
bloodykz вне форума Ответить с цитированием
Старый 04.03.2013, 12:16   #10
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

bloodykz,
хорошо погуглил?
Mikl___ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Транспонирование матрицы (С++) ktulhobraz Помощь студентам 3 04.12.2012 01:00
Транспонирование матрицы iamhated Помощь студентам 0 14.11.2011 18:59
Транспонирование матрицы sys*.12 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 02.11.2011 13:45
транспонирование матрицы Ислам Помощь студентам 3 08.06.2011 19:02
транспонирование матрицы 6*6 на си fatefighter Общие вопросы C/C++ 1 17.03.2010 21:12