;矩阵的基本操作119
;操作方法:加,减,矩阵相乘,转置,数成矩阵
assume cs:code,ss:stack,ds:data
stack segment
db 64 dup(0)
stack ends
data segment
matrix0 db 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
matrix1 db 10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25
matrix2 dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
matrix3 db 16 dup(0)
data ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,64
mov ax,data
mov ds,ax
;加法
mov si,offset matrix0
mov di,offset matrix1
mov bp,offset matrix2
mov bl,0
call matrix
;减法
mov bl,1
call matrix
;矩阵相乘
mov bl,2
call matrix
;转置
mov si,offset matrix0
mov di,offset matrix3
mov bl,3
call matrix
;数乘矩阵
mov di,offset matrix2
mov si,offset matrix0
mov dl,2
mov bl,4
call matrix
mov ax,4c00h
int 21h
;*****************************************************************************************
;矩阵的相关预算,操作矩阵的元素占一个字节单元,相关矩阵均为4x4
;bl:矩阵方法的选择
;0:加法
;ds:[di]:第一个矩阵的首地址
;ds:[si]:第二个矩阵的首地址
;ds:[bp]:结果矩阵的首地址
;1:减法
;ds:[di]:被减矩阵的首地址
;ds:[si]:减数矩阵的首地址
;ds:[bp]:结果矩阵的首地址
;2:矩阵相乘法
;ds:[di]:第一个矩阵的首地址,被成数
;ds:[si]:第二个矩阵的首地址,成数
;ds:[bp]:结果矩阵的首地址
;3:转置
;ds:[si]:被转置的矩阵首地址
;ds:[di]:结果矩阵首地址
;4:数成矩阵
;ds:[si]:被成矩阵的首地址
;dl:成数
;ds:[di]:结果矩阵的首地址
matrix:
jmp matrix_start
;矩阵具有方法的数量
method_num db 5
;矩阵各个方法的入口地址
method dw addition,subtration,multiplication,transpose,data_mul
;矩阵的行
matrix_row dw 4
;矩阵的列
matrix_col dw 4
;子程序结束的地址
matrix_end_address dw matrix_end
;临时数据
matrix_temp dw 0
matrix_start:
push bx
cmp bl,byte ptr method_num
ja method_num_over
mov bh,0
add bx,bx
jmp word ptr method[bx]
method_num_over:
jmp word ptr matrix_end_address
;*********************************************************************
;两个矩阵的加法
;ds:[di]:第一个矩阵的首地址,元素为字节型
;ds:[si]:第二个矩阵的首地址,元素为字节型
;ds:[bp]:结果矩阵的首地址 ,元素为字型
addition:
push ax
push cx
push bp
push di
push si
mov ax,matrix_row
mov cx,matrix_col
mul cl
mov cx,ax
add_loop:
mov al,ds:[di]
mov ah,0
mov ds:[bp],ax
mov al,ds:[si]
add ds:[bp],ax
add bp,2
inc si
inc di
loop add_loop
pop si
pop di
pop bp
pop cx
pop ax
jmp word ptr matrix_end_address
;*********************************************************************
;两个矩阵的减法
;ds:[di]:被减矩阵的首地址,元素为字节型
;ds:[si]:第二个矩阵的首地址,元素为字节型
;ds:[bp]:结果矩阵的首地址 ,元素为字型
subtration:
push ax
push cx
push bp
push di
push si
mov ax,matrix_row
mov cx,matrix_col
mul cl
mov cx,ax
sub_loop:
mov al,ds:[di]
mov ah,0
mov ds:[bp],ax
mov al,ds:[si]
sub ds:[bp],ax
add bp,2
inc si
inc di
loop sub_loop
pop si
pop di
pop bp
pop cx
pop ax
jmp word ptr matrix_end_address
;*********************************************************************
;两个矩阵的成法
;ds:[di]:第一个矩阵的首地址,被成数,元素为字节型
;ds:[si]:第二个矩阵的首地址,成数,元素为字节型
;ds:[bp]:结果矩阵的首地址 ,元素为字型
multiplication:
push ax
push bx
push cx
push bp
mov matrix_temp,bp
mov cx,matrix_row
mul_row_loop:
push cx
mov cx,matrix_col
mul_col_loop:
push cx
push si
push di
mov word ptr ds:[bp],0
;根据bp计算行列值,bp结果矩阵的存储偏移地址
push bp
sub bp,matrix_temp
mov ax,bp
pop bp
mov bl,2
div bl
mov ah,0
mov bl,4
div bl
mov bx,ax
;ax中为列数
mov al,ah
mov ah,0
add si,ax
;bx中为行数
mov bh,0
mov al,4
mov ah,0
mul bl
add di,ax
;计算结果矩阵的每个元素
mov cx,matrix_col
mul_element_loop:
;行
mov al,ds:[di]
;列
mul byte ptr ds:[si]
add ds:[bp],ax
add si,matrix_col
inc di
loop mul_element_loop
pop di
pop si
pop cx
add bp,2
loop mul_col_loop
pop cx
loop mul_row_loop
pop bp
pop cx
pop bx
pop ax
jmp word ptr matrix_end_address
;*********************************************************************
;矩阵的转置
;ds:[si]:被转置的矩阵首地址,元素为字节型
;ds:[di]:结果矩阵首地址,元素为字节型
transpose:
push ax
push bx
push cx
push si
push di
mov cx,matrix_row
trans_row_loop:
push cx
push di
mov cx,matrix_col
trans_col_loop:
mov al,ds:[si]
mov ds:[di],al
add di,matrix_row
inc si
loop trans_col_loop
pop di
pop cx
inc di
loop trans_row_loop
pop di
pop si
pop cx
pop bx
pop ax
jmp word ptr matrix_end_address
;*********************************************************************
;数字与矩阵的乘法
;ds:[si]:被成矩阵的首地址,元素为字节型
;dl:成数
;ds:[di]:结果矩阵的首地址,元素为字型
data_mul:
push ax
push bx
push cx
push si
push di
mov ax,matrix_row
mov ah,0
mov bx,matrix_col
mul bl
mov cx,ax
data_mul_loop:
mov al,ds:[si]
mul dl
mov ds:[di],ax
add di,2
inc si
loop data_mul_loop
pop di
pop si
pop cx
pop bx
pop ax
jmp word ptr matrix_end_address
;*********************************************************************
matrix_end:
pop bx
ret
;*****************************************************************************************
code ends
end start
;*****************************************************************************************
[07/10/11] |