.model small
.stack 100h
.data
a dw 1, 2, 3, 4, 5, 6, 7, 8, 9
b dw 9, 8, 7, 6, 5, 4, 3, 2, 1
c dw 0, 0, 0, 0, 0, 0, 0, 0, 0
scalar dw 2
.code
mov ax, @data
mov ds, ax
; Matrix multiplication
mov cx, 3 ; outer loop counter (rows of a)
mov di, 0 ; index for a
mov si, 0 ; index for b
multiply_loop:
push cx ; save outer loop counter
mov bx, 0 ; index for c
mov dx, 0 ; inner loop counter
inner_loop:
mov ax, a[di]
mov bx, b[si]
mul bx
add c[bx], ax
add di, 2 ; move to next element in a
add si, 2 ; move to next element in b
inc dx ; increment inner loop counter
cmp dx, 3 ; check if inner loop counter reached 3
jl inner_loop ; if not, continue inner loop
pop cx ; restore outer loop counter
add di, 2 ; move to next row in a
mov si, 0 ; reset index for b
inc bx ; increment index for c
cmp bx, 3 ; check if outer loop counter reached 3
jl multiply_loop ; if not, continue outer loop
; Print the result of matrix multiplication
mov ah, 2 ; print character function
mov dl, 13 ; carriage return
int 21h
mov dl, 10 ; line feed
int 21h
mov cx, 9 ; total elements in c
mov di, 0 ; index for c
print_loop:
mov ax, c[di]
add ax, 48 ; convert to ASCII
mov dl, al ; move lower byte to dl
mov ah, 2 ; print character function
int 21h
inc di ; move to next element in c
loop print_loop ; continue printing until all elements are printed
; Multiply the result by the scalar
mov cx, 9 ; total elements in c
mov di, 0 ; index for c
mov ax, scalar
multiply_scalar_loop:
mul c[di]
mov c[di], ax
inc di ; move to next element in c
loop multiply_scalar_loop ; continue multiplying until all elements are multiplied
; Print the result after scalar multiplication
mov ah, 2 ; print character function
mov dl, 13 ; carriage return
int 21h
mov dl, 10 ; line feed
int 21h
mov cx, 9 ; total elements in c
mov di, 0 ; index for c
print_scalar_loop:
mov ax, c[di]
add ax, 48 ; convert to ASCII
mov dl, al ; move lower byte to dl
mov ah, 2 ; print character function
int 21h
inc di ; move to next element in c
loop print_scalar_loop ; continue printing until all elements are printed
mov ax, 4C00h ; exit program
int 21h
end
有人能帮我这个代码,它的打印一些符号和零,当我运行它。错误在哪里?
我试着乘2矩阵和乘结果矩阵与标量和它的打印不好。
1条答案
按热度按时间des4xlb01#
乘法
如果BX应该在 c 数组中包含一个偏移量,那么为什么要在从 b 数组(
mov bx, b[si]
)加载时销毁该值呢?如果DX应该包含你的内部循环计数器,那么为什么你允许它被字大小的乘法
mul bx
破坏,在寄存器组合DX:AX中留下一个乘积?你得下定决心!外循环计数器在CX中;为什么要看BX?而 c 数组的索引必须以2为步长递增,因为它是一个字大小的数组。
总之,你的矩阵乘法没有做它需要做的事情。你在这里学习的道路上,所以请不要指望我为你写这一切,但在过去,我已经回答了一个类似的问题,你可以学习,这应该有助于你找到它主要是你自己的。
打印
在print循环中,您似乎期望 c 数组中的元素都在个位数范围内。不会的!您需要一个可以将AX中的值转换为字符串的转换代码。我在Displaying numbers with DOS中准备了这样一段代码。
再次相乘
在这个循环中,需要在每次迭代中重新加载标量,而不仅仅是第一次。而要真正“移动到c中的下一个元素”,你需要加上2而不是1。
再次打印
和上面的完全一样。
祝你好运
一旦你做得更好了,它仍然不工作,那么不要犹豫,并张贴您的改进代码说明任何问题仍然存在。