assembly 为什么我的emu8086矩阵乘法代码不能打印预期的结果?

rjee0c15  于 2023-05-29  发布在  其他
关注(0)|答案(1)|浏览(172)
.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矩阵和乘结果矩阵与标量和它的打印不好。

des4xlb0

des4xlb01#

乘法

mov bx, b[si]
mul bx
add c[bx], ax

如果BX应该在 c 数组中包含一个偏移量,那么为什么要在从 b 数组(mov bx, b[si])加载时销毁该值呢?
如果DX应该包含你的内部循环计数器,那么为什么你允许它被字大小的乘法mul bx破坏,在寄存器组合DX:AX中留下一个乘积?

inc bx           ; increment index for c
cmp bx, 3        ; check if outer loop counter reached 3
jl multiply_loop ; if not, continue outer loop

你得下定决心!外循环计数器在CX中;为什么要看BX?而 c 数组的索引必须以2为步长递增,因为它是一个字大小的数组。
总之,你的矩阵乘法没有做它需要做的事情。你在这里学习的道路上,所以请不要指望我为你写这一切,但在过去,我已经回答了一个类似的问题,你可以学习,这应该有助于你找到它主要是你自己的。

打印

在print循环中,您似乎期望 c 数组中的元素都在个位数范围内。不会的!您需要一个可以将AX中的值转换为字符串的转换代码。我在Displaying numbers with DOS中准备了这样一段代码。

再次相乘

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

在这个循环中,需要在每次迭代中重新加载标量,而不仅仅是第一次。而要真正“移动到c中的下一个元素”,你需要加上2而不是1。

再次打印

和上面的完全一样。

祝你好运

一旦你做得更好了,它仍然不工作,那么不要犹豫,并张贴您的改进代码说明任何问题仍然存在。

相关问题