8086 输入两个矩阵的行列并相乘
时间: 2023-09-28 11:04:12 浏览: 136
以下是使用8086汇编语言实现输入两个矩阵的行列并相乘的示例代码:
```
.model small
.stack 100h
.data
; 定义数据段
msg1 db 'Enter the number of rows of matrix1: $'
msg2 db 'Enter the number of columns of matrix1: $'
msg3 db 'Enter the number of rows of matrix2: $'
msg4 db 'Enter the number of columns of matrix2: $'
msg5 db 'Enter the elements of matrix1: $'
msg6 db 'Enter the elements of matrix2: $'
msg7 db 'The result of matrix multiplication is: $'
matrix1 db 100 dup(0) ; 存储矩阵1的元素
matrix2 db 100 dup(0) ; 存储矩阵2的元素
result db 100 dup(0) ; 存储矩阵相乘的结果
rows1 dw ? ; 矩阵1的行数
cols1 dw ? ; 矩阵1的列数
rows2 dw ? ; 矩阵2的行数
cols2 dw ? ; 矩阵2的列数
.code
; 定义代码段
main proc
mov ax, @data
mov ds, ax ; 初始化数据段寄存器
; 输入矩阵1的行列数
mov ah, 9 ; 显示字符串
lea dx, msg1 ; 加载要显示的字符串地址
int 21h ; 调用21h中断显示字符串
mov ah, 1 ; 读入一个字符
int 21h ; 调用21h中断读入一个字符
sub al, 30h ; 将字符转换为数字
mov rows1, ax ; 存储行数
mov ah, 9 ; 显示字符串
lea dx, msg2 ; 加载要显示的字符串地址
int 21h ; 调用21h中断显示字符串
mov ah, 1 ; 读入一个字符
int 21h ; 调用21h中断读入一个字符
sub al, 30h ; 将字符转换为数字
mov cols1, ax ; 存储列数
; 输入矩阵2的行列数
mov ah, 9 ; 显示字符串
lea dx, msg3 ; 加载要显示的字符串地址
int 21h ; 调用21h中断显示字符串
mov ah, 1 ; 读入一个字符
int 21h ; 调用21h中断读入一个字符
sub al, 30h ; 将字符转换为数字
mov rows2, ax ; 存储行数
mov ah, 9 ; 显示字符串
lea dx, msg4 ; 加载要显示的字符串地址
int 21h ; 调用21h中断显示字符串
mov ah, 1 ; 读入一个字符
int 21h ; 调用21h中断读入一个字符
sub al, 30h ; 将字符转换为数字
mov cols2, ax ; 存储列数
; 验证矩阵能否相乘
cmp cols1, rows2
jne exit
mov bx, rows1 ; 矩阵1的行数
mov cx, cols2 ; 矩阵2的列数
; 输入矩阵1的元素
mov ah, 9 ; 显示字符串
lea dx, msg5 ; 加载要显示的字符串地址
int 21h ; 调用21h中断显示字符串
mov di, 0 ; 初始化偏移地址
mov ax, 0 ; 初始化累加器
input1:
mov ah, 1 ; 读入一个字符
int 21h ; 调用21h中断读入一个字符
cmp al, 0dh ; 判断是否为回车符
je next1 ; 如果是回车符,则跳转到下一行
sub al, 30h ; 将字符转换为数字
mov matrix1[di], al ; 存储矩阵元素
inc di ; 偏移地址加1
inc ax ; 累加器加1
cmp ax, cols1 ; 比较累加器和列数
jne input1 ; 如果累加器小于列数,则继续输入
mov ah, 2 ; 换行
mov dl, 0dh ; 回车符
int 21h ; 调用21h中断输出
mov dl, 0ah ; 换行符
int 21h ; 调用21h中断输出
; 输入矩阵2的元素
mov ah, 9 ; 显示字符串
lea dx, msg6 ; 加载要显示的字符串地址
int 21h ; 调用21h中断显示字符串
mov di, 0 ; 初始化偏移地址
mov ax, 0 ; 初始化累加器
input2:
mov ah, 1 ; 读入一个字符
int 21h ; 调用21h中断读入一个字符
cmp al, 0dh ; 判断是否为回车符
je next2 ; 如果是回车符,则跳转到下一行
sub al, 30h ; 将字符转换为数字
mov matrix2[di], al ; 存储矩阵元素
inc di ; 偏移地址加1
inc ax ; 累加器加1
cmp ax, cols2 ; 比较累加器和列数
jne input2 ; 如果累加器小于列数,则继续输入
mov ah, 2 ; 换行
mov dl, 0dh ; 回车符
int 21h ; 调用21h中断输出
mov dl, 0ah ; 换行符
int 21h ; 调用21h中断输出
; 计算矩阵乘积
mov si, 0 ; 初始化偏移地址
mul:
mov di, 0 ; 初始化累加器
mov cl, cols2 ; 矩阵2的列数
mov bx, si ; 矩阵1当前行的偏移地址
mul2:
mov al, matrix1[bx] ; 取出矩阵1的元素
mov dx, matrix2[di] ; 取出矩阵2的元素
mul dx ; 对两个元素进行乘法运算
add result[si], al ; 将结果加到相应位置上
inc di ; 矩阵2的列号加1
add bx, cols1 ; 矩阵1的行号加1
loop mul2 ; 如果矩阵2的列号小于矩阵2的列数,则继续相乘
add si, cols2 ; 矩阵1的偏移地址加上矩阵2的列数
cmp si, rows1*cols2 ; 如果矩阵1的偏移地址大于等于矩阵1的总元素数,则结束循环
jne mul
; 输出矩阵乘积
mov ah, 9 ; 显示字符串
lea dx, msg7 ; 加载要显示的字符串地址
int 21h ; 调用21h中断显示字符串
mov si, 0 ; 初始化偏移地址
output:
mov al, result[si] ; 取出矩阵乘积的元素
add al, 30h ; 将数字转换为字符
mov ah, 2 ; 输出字符
mov dl, al
int 21h ; 调用21h中断输出
inc si ; 偏移地址加1
cmp si, rows1*cols2 ; 如果偏移地址大于等于矩阵乘积的总元素数,则结束循环
jne output
exit:
mov ah, 4ch ; 退出程序
int 21h ; 调用21h中断
main endp
end main
```
该程序通过中断21h实现了输入和输出,通过使用寄存器来存储矩阵的行列数和元素,以及矩阵相乘的结果。在计算矩阵乘积时使用了双重循环,通过寄存器来存储矩阵元素的偏移地址。最后输出矩阵乘积。
阅读全文