汇编实现矩阵的转置
题意:
给定一个 4 * 5 的矩阵 , 把它转置后存到 data2.
思路:
- 首先汇编不向其他语言,可以直接根据下表访问地址,数组中的数是放在一段连续的内存单元中。也就是说我们转置后还是相当于储存在一个一位数组中。
- 所以我们可以先模拟一下转置的过程,我们要首先把第一列存入data2 ,再把第二列依次存入 data2…,知道最后一列存入。先考虑第一列如何放入,首先把第一个元素的地址存入寄存器,然后每次 + 4,把这个值存入 data2,同时 data2 的寄存器 ++ ,就可以实现这个功能。那么第二列我们怎么让寄存器回到 第二个元素呢?这里我们可以再用一个寄存器保存上一次是从哪个开始的,每次大循环把这个地址 + 1 就好了。
- 我们也可以不用地址寄存器,直接用一个 bx 计数器,记录这一次应该从第几个元素开始
lea si,[data1 + bx] ;每次移动的初始位置
,一开始用的 si + bh ,然后发现不行,然后老师说要 16位匹配,所以要用 bx. - 一开始要写二重循环不知道何从下手,以为只能用 cx 作循环记录,其实随便用哪个都行,只要最后判断一下再跳回开头就好了。
代码:
DATAs SEGMENT
N DW 5;
M DW 4
DATA1 DB 1,2,3,4
DB 10,20,30,40
DB 11,12,13,14
DB 20,30,40,50
DB 21,22,23,24
DATA2 DB 20 DUP(0)
DATAs ends
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
mov ax,datas
mov ds,ax
lea di,data2
lea bp,data1
mov cx,M
mov dh,0
loop1:
mov si,bp ;每次移动的初始位置
mov bh ,N ;每次循环次数
loop2:
mov dh,[si]
mov [di],dh ;移到 data2
inc di
add si,M ;移到下一行
dec bh
cmp bh,0
ja loop2
inc bp ; 初始位置 ++
loop loop1
MOV AH,4CH
INT 21H
CODES ENDS
END START
或者:
DATAs SEGMENT
N DW 5;
M DW 4
DATA1 DB 1,2,3,4
DB 10,20,30,40
DB 11,12,13,14
DB 20,30,40,50
DB 21,22,23,24
DATA2 DB 20 DUP(0)
DATAs ends
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
mov ax,datas
mov ds,ax
lea di,data2
mov cx,4
mov bx,0
loop1:
lea si,[data1 + bx] ;每次移动的初始位置
mov dl ,5 ;每次循环次数
loop2:
mov dh,[si]
mov [di],dh ;移到 data2
inc di
add si,M ;移到下一行
dec dl
cmp dl,0
ja loop2
inc bx ; 初始位置 ++
loop loop1
MOV AH,4CH
INT 21H
CODES ENDS
END START