(emu8086) умножение матрицы 3х3 на массив - PullRequest
0 голосов
/ 20 мая 2011

если кто-нибудь знает язык ассемблера, мне действительно нужна помощь в отладке моей программы. У меня есть матрица 3х3 и вектор из 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 Ответ

1 голос
/ 20 мая 2011

Читая предоставленный код, я обнаружил несколько странных строк:

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

Но здесь вы должны знать, что вы умножаете al на al, что, я полагаю, не является желаемой операцией.

В качестве решения вы можете переименовывать каждый случай с bh или bl на dh/dl или ch/cl и соответственно изменять коэффициент в умножении. Тогда индекс остается прежним, и цикл будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...