2011-05-20 212 views
0

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

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

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

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

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,并相应地更改乘法中的因数。然后索引保持不变,循环将起作用。