汇编实现矩阵的转置

汇编实现矩阵的转置

题意:
给定一个 4 * 5 的矩阵 , 把它转置后存到 data2.

思路:

  1. 首先汇编不向其他语言,可以直接根据下表访问地址,数组中的数是放在一段连续的内存单元中。也就是说我们转置后还是相当于储存在一个一位数组中。
  2. 所以我们可以先模拟一下转置的过程,我们要首先把第一列存入data2 ,再把第二列依次存入 data2…,知道最后一列存入。先考虑第一列如何放入,首先把第一个元素的地址存入寄存器,然后每次 + 4,把这个值存入 data2,同时 data2 的寄存器 ++ ,就可以实现这个功能。那么第二列我们怎么让寄存器回到 第二个元素呢?这里我们可以再用一个寄存器保存上一次是从哪个开始的,每次大循环把这个地址 + 1 就好了。
  3. 我们也可以不用地址寄存器,直接用一个 bx 计数器,记录这一次应该从第几个元素开始 lea si,[data1 + bx] ;每次移动的初始位置,一开始用的 si + bh ,然后发现不行,然后老师说要 16位匹配,所以要用 bx.
  4. 一开始要写二重循环不知道何从下手,以为只能用 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


猜你喜欢

转载自blog.csdn.net/hddddh/article/details/110356395