Матрица в сборке mxn размерности - PullRequest
0 голосов
/ 24 декабря 2011

Я сделал код в сборке 8086. Я загружаю матрицу (массив) в память размером 3х3.но этот код работает только для этого размера матрицы 3x3.Может ли кто-нибудь дать мне идею, как я могу заставить его работать с измерением mxn?массив загружается в память и в конце просто выводится результат, другой массив.спасибо

; multi-segment executable file template.

data segment
matrix db 1, 2, 3, 4, 5, 6, 7, 8, 9 ; load matrix in memory

ends

stack segment
dw 128 dup(0)
ends

code segment
start:
; set segment registers:
mov ax, data
mov ds, ax
mov es, ax



mov bx, matrix ; move matrix to offset bx
mov ch, 3
mov cl, 0


COLUMNAHEAD: 

mov dl, [bx] ; get the first element of matrix in dl
add dl, 30h ; add to show number
mov ah, 02h
int 21h ; print first number
inc cl 

cmp cl, ch ; compare if the counter is at the end of column


jge ROWAHEAD ; if greater go to row
add bx, 3 ; if not inc offset for 3 
jmp COLUMNAHEAD





ROWAHEAD:
inc cl ; 1 element of roe
inc bx ; inc offset for one place
mov dl, [bx] ; get the number in dl
add dl, 30h ; convert to number
mov ah, 02h
int 21h ; print the number

cmp cl, 5 
je COLUMNAHEAD
jne ROWAHEAD 


COLUMNBACK:
inc cl 
sub bx, 3
mov dl, [bx]
add dl, 30h
mov ah, 02h
int 21h 
cmp cl, 7
jne COLUMNBACK 
je ROWBACK

ROWBACK:
dec bx 
mov dl, [bx] 
add dl, 30h
mov ah, 02h
int 21h 
JMP MIDDLE


MIDDLE:
add bx, 3
mov dl, [bx] 
add dl, 30h
mov ah, 02h
int 21h 

JMP END

END: 


this is the code i wrote. it works for the matrix 
1, 2, 3,
4, 5, 6, 
7, 8, 9 and print 1, 4, 7, 8, 9, 6, 3, 2, 5

Матрица, предоставленная в памяти для печати спирали в направлении, противоположном по часовой стрелке (левый столбец вниз, правый нижний диапазон, правый столбец вверх, ряд слева вверху и т. д., пока вы не попадете в среду).Это работает только для измерения 3x3.это должно работать для измерения mxn.но я не знаю как, любое предложение ???

1 Ответ

0 голосов
/ 04 января 2012

При наличии матрицы M (строки) x N (столбцы) один оборот желаемого алгоритма распечатывает периметр матрицы.Следующий ход получает (M-2) x (N-2) матрицу (которая хранится в памяти особым образом).Этот факт позволяет эффективно итеративную формулировку.

Давайте использовать ваш алгоритм выше.Тогда ход выглядит следующим образом:

COLUMNAHEAD(M); ROWAHEAD(N-1); COLUMNBACK(M-1); ROWBACK(N-2);

Здесь количество печатаемых элементов указано в скобках.Алгоритм должен быть остановлен, когда любое из этих чисел достигнет 0.

Итак, вам необходимо помимо самой матрицы следующие переменные:

- pointer to the current element (your ds:bx)
- values M and N, kept until algorithm stopped
- shift parameter, let be D

Более подробно набросок требуемого алгоритмавыглядит так:

D := 0
label:
if (M-D==0) stop
COLUMNAHEAD(M-D)
inc D
if (N-D==0) stop
ROWAHEAD(N-D)
if (M-D==0) stop
COLUMNBACK(M-D)
inc D
if (N-D==0) stop
ROWBACK(N-D)
goto label

Особое внимание следует уделить правильной индексации (используя M и 1 в качестве значений смещения).Также рекомендуется простая оптимизация, такая как минимизация числа команд в циклах, руководствуясь уменьшением переменных (DEC / JZ или даже LOOP) или лучшим использованием регистров (si вместо bx).Также обратите внимание, что матрицы обычно хранятся в памяти по столбцам (тогда 1 и N становятся правильными смещениями).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...