汇编mxn维度中的矩阵

时间:2011-12-24 19:20:07

标签: assembly x86

我在程序集8086中创建了一个代码。我将矩阵(数组)加载到内存中,尺寸为3x3。但是这段代码只适用于矩阵3x3的这个维度。有人能给我一个想法,我怎么能让它与尺寸m x n一起工作?数组加载到内存中,最后只打印结果,另一个数组。感谢

; 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 :(得分:0)

当具有矩阵M(行)×N(cols)时,所需算法的一圈打印出矩阵的周长。下一轮获得(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成为正确的位移)。