(emu8086)将3x3矩阵与数组相乘

时间:2011-05-20 11:23:21

标签: x86 assembly

如果有人知道汇编语言,我真的需要一些帮助来调试我的程序。我有一个3x3矩阵和一个3元素矢量,我从控制台读取,我需要将它们相乘并显示结果数组。

到目前为止,这是我的代码:

name "2x2_matrix"
include "emu8086.inc"
org 100h ; directive make tiny com file.


.model small
.stack 100h
.data

size    dw      3  
A       db      ?,?,?,?,?,?,?,?,?     
B       db      ?,?,?
C       db      ?,?,?

message_a db 10,13,"type the elements of matrix A:$"
message_b db 10,13,"type the elements of array B:$"
rez db 10,13,"the result is:$"     

.code 
start: 
mov ax,@data
mov ds,ax

mov bx, 0  ; 

 read_a: 
;compare with sizexsize
mov ax, size
mul size
cmp bx, ax
je reset_counter

;display message
mov dx, offset message_a
mov ah, 09h
int 21h

;read element
mov ah, 01h
int 21h
sub al, 30h
mov A[bx], al

inc bx
jmp read_a

reset_counter:
mov bx, 0        
jmp read_b    

read_b:  
;compare with size
mov ax, size
cmp bx, ax
je calcul

;display message
mov dx, offset message_b
mov ah, 09h
int 21h

;read element
mov ah, 01h
int 21h
sub al, 30h
mov B[bx], al

inc bx
jmp read_b

calcul:
mov bx,0 
mov cx,0  

for_i:       
    mov ax, size
    cmp bx, ax
    je print 

    mov al,b.size
    mul bx

    mov al, A[bx+1]
    mov bh, B[bx+1]
    mul bh
    add C[bx], ah

    mov al, b.A[bx+2]
    mov bl, b.B[bx+2]
    mul al
    add C[bx], ah

    mov al, b.A[bx+3]
    mov bl, b.B[bx+3]
    mul al
    add C[bx], ah

    inc bx
    jmp for_i               

print:

mov dx, offset rez
mov ah,09h
int 21h

mov     ax,size
mul     size
mov     cx,ax
mov     ax,0
mov     bx,0

print_c:

    cmp     bx,cx
    je      finish

    mov     al, C[bx]
    CALL    PRINT_NUM

    inc     bx
    jmp     print_c

DEFINE_PRINT_NUM
DEFINE_PRINT_NUM_UNS

finish:
ret

end start

end

在插入元素之后似乎循环并且不显示任何内容,我不知道如何调试它。如果有人熟悉汇编程序类型编码并且可以帮我修改代码,我会非常感激!

1 个答案:

答案 0 :(得分:1)

通过阅读提供的代码,我发现了一些奇怪的行:

mov bh, B[bx+1]
mul bh

在这里,您可以为寄存器bh(以及最终bx)分配一个新值,以便与ah相乘。但是您也使用bx作为结果数组的索引。在我看来,好像你在计算必要的信息时更改了数组索引。

以下几行也是如此

mov al, b.A[bx+2]
mov bl, b.B[bx+2]
mul al
add C[bx], ah

mov al, b.A[bx+3]
mov bl, b.B[bx+3]
mul al
add C[bx], ah

但是在这里你应该知道你将alal相乘,我认为这不是理想的操作。

作为解决方案,您可以将bhbl的每次出现重命名为dh/dlch/cl,并相应地更改乘法中的因子。然后索引保持不变,循环将起作用。