首页 文章

使用8051上的汇编进行矩阵乘法?

提问于
浏览
-1

在组装和8051时我是新手,所以我需要一些帮助 . 我想做这个矩阵乘法 . 我无法弄清楚为什么这是一个无限循环我尝试我的水平最好调试,但我不能 . 任何一个针都可以指出错误吗?将矩阵A m乘以n,将矩阵B o乘以p

mov dptr,#8001h
mov r0,#04h
mov r1,#03h

;getting values of m,n,o,p saving at 3h,4h,5h,6h registers
acall load


;store matrix A
mov a,03h
mov b,04h
mul ab
mov r0,a
mov r1,#10h
mov dptr,#8100h
acall load

;store matrix B
mov a,05h
mov b,06h
mul ab
mov r0,a
mov r1,#20h
mov dptr,#8200h
acall load

;multiply A with B and store it in C
mov 0dh,#00h
loop1:
    mov 0eh,#00h
    loop2:
        ;C element location calc
        mov a,0dh
        mov b,06h
        mul ab
        add a,0eh
        add a,#30h
        mov 0ch,a
        mov r0,a
        mov @r0,#00h

        ;initilize k
        mov 0fh,#00h
        loop3:

            ;A element location calc
            mov a,0dh
            mov b,04h
            mul ab
            add a,0fh
            add a,#10h
            mov 0ah,a

            ;B element location calc
            mov a,0fh
            mov b,06h
            mul ab
            add a,0eh
            add a,#20h
            mov 0bh,a

            ;A*B of elements
            mov 00h,0ah
            mov a,@r0
            mov r1,0bh
            mov b,@r1
            mul ab

            ;c+=a*b
            mov b,a
            mov r0,0ch
            mov a,@r0
            add a,b
            mov @r0,a

            ;increment k and loop
            inc 0fh
            mov a,0fh
            cjne a,04h,loop3

        ;increment j and loop
        inc 0eh
        mov a,0eh
        cjne a,06h,loop2

    ;increment i and loop
    inc 0dh
    mov a,0dh
    cjne a,03h,loop1

;output MATRIX C
mov dptr,#8300h
mov r1,#30h
mov a,03h
mov b,06h
mul ab
mov r0,a

;output values from ram to memory no of values at r0, address of matrix in r1
l2:
    mov a,@r1
    movx @dptr,a
    inc r1
    inc dptr
    djnz r0,l2

sjmp endd
;if not equal write 1 at 8000h


;loading values from memory to ram no of values at r0, address of ram in r1
load:
l1:
    movx a,@dptr
    inc dptr
    mov @r1,a
    inc r1
    djnz r0,l1
ret 
endd: 
end

1 回答

  • -1
    mov dptr,#8001h ;start taking m,n,o,p
    mov r0,#04h ;loop variable
    mov r1,#03h ;location of ram to save
    
    ;getting values of m,n,o,p saving at 3h,4h,5h,6h registers
    acall load ;loading values
    ;comparing n,o
    mov a,04h
    cjne a,05h,no
    ;if equal write 0 at 8000h 
    acall multi
    ljmp endd
    ;if not equal write 1 at 8000h
    no:
        mov dptr,#8000h
        mov a,#01h
        movx @dptr,a
        ljmp endd
    
    multi:  
    mov dptr,#8000h
    mov a,#00h
    movx @dptr,a    
    
    ;store matrix A
    mov a,03h;get m
    mov b,04h;get n
    mul ab;m*n
    mov r0,a;no of elements in A
    mov r1,#10h;ram location for matrix
    mov dptr,#8100h;get matrix
    acall load;call load
    
    ;store matrix B
    mov a,05h;get 0
    mov b,06h;get p
    mul ab;0*p
    mov r0,a;no of elements in B
    mov r1,#20h;ram location for matrix
    mov dptr,#8200h;get matrix
    acall load;call load
    
    ;multiply A with B and store it in C
    mov 0dh,#00h
    loop1:
        mov 0eh,#00h
        loop2:
            ;C element location calc
            mov a,0dh
            mov b,06h
            mul ab
            add a,0eh
            add a,#30h
            mov 0ch,a
            mov r0,a
            mov @r0,#00h
    
            ;initilize k
            mov 0fh,#00h
            loop3:
    
                ;A element location calc
                mov a,0dh
                mov b,04h
                mul ab
                add a,0fh
                add a,#10h
                mov 0ah,a
    
                ;B element location calc
                mov a,0fh
                mov b,06h
                mul ab
                add a,0eh
                add a,#20h
                mov 0bh,a
    
                ;A*B of elements
                mov 00h,0ah
                mov a,@r0
                mov r1,0bh
                mov b,@r1
                mul ab
    
                ;c+=a*b
                mov b,a
                mov r0,0ch
                mov a,@r0
                add a,b
                mov @r0,a
    
                ;increment k and loop
                inc 0fh
                mov a,0fh
                cjne a,04h,loop3
    
            ;increment j and loop
            inc 0eh
            mov a,0eh
            cjne a,06h,loop2
    
        ;increment i and loop
        inc 0dh
        mov a,0dh
        cjne a,03h,loop1
    
    ;output MATRIX C
    mov dptr,#8300h
    mov r1,#30h
    mov a,03h
    mov b,06h
    mul ab
    mov r0,a
    
    ;output values from ram to memory no of values at r0, address of matrix in r1
    l2:
        mov a,@r1
        movx @dptr,a
        inc r1
        inc dptr
        djnz r0,l2
    
    ret
    
    ;loading values from memory to ram no of values at r0, address of ram in r1
    load:
    l1:
        movx a,@dptr
        inc dptr
        mov @r1,a
        inc r1
        djnz r0,l1
    ret 
    endd: 
    end
    

    发现我的错误并在此纠正它是最终结果

相关问题