Работа с матрицей

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
шпрот
Сообщения: 4
Зарегистрирован: 09 янв 2010, 14:51

Помогите решить. такое задание: программа меняет местами главную и побочную диагональ квадратной матрицы М*М, М=6. Матрица вводится с файла, на который указывает оператор.Результат выводится в новый файл.
airyashov
Сообщения: 441
Зарегистрирован: 02 ноя 2007, 10:31

что именно не получается, показывайте код
icq:3(один)7748666
mail:airyashov( а)inbox.ru
шпрот
Сообщения: 4
Зарегистрирован: 09 янв 2010, 14:51

я не знаю, как написать саму прогу
шпрот
Сообщения: 4
Зарегистрирован: 09 янв 2010, 14:51

вот программа, которую написала. но вывод не в файл, а на экран. если кому нужно ^____^

stk segment stack
dw 256 dup ('0')
stk ends

data segment
array db 256 dup(' ')
dimension db 5 ;размерность
i db 0
elmatr db 3 dup (' '),'$'
ent db 0dh,0ah,'$' ;0dh-возврат каретки, перевод строки
errormsg db 'The elements must be digital','$'
pathsource db 'D:\source.txt',00h ;00h - признак окончания строки
pathout db 'D:\borlandc\bin\output.txt',00h
handlesource dw ?
errorOpenMsg db 'No such file','$'
errorReadMsg db 'Error read file','$'
errorCloseMsg db 'Error open file','$'



data ends

code segment
;------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
main proc far ;far - перемещение по дальнему адресу
assume cs:code, ds:data,ss:stk ;инициализация


mov ax,data
mov ds,ax

call openfile
cmp al,01
je exit1

call readfile
cmp al,01
je exit1

call check
cmp al,01
je exit1

call output

call change
call newline
call newline
call output

call closesource
cmp al,01
je exit1
exit1:
mov ax,4c00h
int 21h
main endp
;------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
closesource proc
mov ah,3eh
mov bx,handlesource
int 21h
jc errorclose
jmp f
errorclose:
mov ah,09h
mov dx,offset errorReadMsg
int 21h
mov al,01
f: ret
closesource endp
;------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
readfile proc
mov ah,3fh
mov bx,handlesource
mov cx,255
mov dx,offset array
int 21h
jc errorReadFile
cmp ax,00
jc errorReadFile
jmp t
errorReadFile:
mov ah,09h
mov dx,offset errorReadMsg
int 21h
mov al,01
t: ret
readfile endp
;------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
openfile proc
mov ah,3dh
mov al,00
mov dx,offset pathsource ;lea dx,pathsource
int 21h
jc erroropen
mov handlesource,ax
mov al,0
jmp p
erroropen: mov ah,09h
mov dx,offset errorOpenMsg
int 21h
mov al,01
p: ret
openfile endp
;------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
check proc
mov si,offset array ; заносим в si адрес смещения
mov ax,0
mov al,dimension
mul dimension
mov cx,ax ;cx= dimension*dimension - счетчик
checkloop:
mov al,[si] ; в al первый элемент
cmp al,30h ; код нуля
jb errorcheck
cmp al,39h ;код девяти
ja errorcheck
inc si
loop checkloop
mov al,0
jmp n
errorcheck:
mov ah,09h
mov dx,offset errormsg
int 21h
mov al,01
n: ret
check endp
;------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
newline proc
mov ah,09h
mov dx,offset ent ;переход на новую строку
int 21h
ret
newline endp
;------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
change proc
mov si,0 ; i
mov di,0 ; j
mov ax,0
mov dx,0 ;для хранения элемента массива
mov cx,0
mov cl,dimension ;cx=dimension
loopik:
mov ax,si
mul dimension
mov bp,ax ;bp= si*dimension
mov bx,0 ;чтобы bh = 0
mov bl,dimension
sub bl,1
sub bx,di ;bx= dimension-1-di
mov dl,array[bp+di]
push si ;si заносим в стек
mov si,bx
xchg dl,array[bp+si]
pop si ;получаем si из стека
xchg dl,array[bp+di] ;меняем местами элементы
inc di
inc si
dec cx ;счетчик, когда 0 -> выход из цикла
jnz loopik
ret
change endp
шпрот
Сообщения: 4
Зарегистрирован: 09 янв 2010, 14:51

;------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
output proc
mov si,0 ; индекс i массива
mov di,0 ;столбец массива
mov al,dimension
mul dimension
mov cx,ax ; cx= dimension*dimension - количество итераций для inloop
mov bx,0 ; счетчик на количество столбцов (для перехода на новую строку)
inloop:
mov ax,si
mul dimension
mov bp,ax ;bp= si*dimension
mov al,array[bp+di]
mov elmatr,al ; элемент матрицы заносим в переменную elmatr
cmp bl,dimension
je enter1
m:
mov ah, 09h
mov dx,offset elmatr
int 21h
inc di
inc bx
dec cx
jnz inloop
ret
enter1:
call newline
mov bx,0
mov di,0
inc si
jmp m

output endp
;------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
code ends ;окончание сегмента кода
end main ;окончание программы
Ответить