2016-07-07 4 views
0

Я думаю, что мой код должен быть запущен правильно (это кажется логичным), но в последнем цикле инструкция декремента не работает, и программа входит в бесконечный цикл , вот мой код:8086 программа для вычисления умножения двух матриц не работает

; multi-segment executable file template. 

data segment 
matrix1 db 1,2,3,4,5,6,7,8,9 
matrix2 db 1,2,3,4,5,6,7,8,9 
n dw 3 
row db 3 
column dw 3 
n2 db 9 
result db 100 dup(0) 
counter dw 3 


ends 

stack segment 
dw 128 dup(0) 
ends 

code segment 
start: 
; set segment registers: 
mov ax, data 
mov ds, ax 
mov es, ax 


mov bx,offset matrix1 
mov bp,offset result 


sub bx,n 
dec bx  
push bx 


new_row: 

mov di,offset matrix2 
dec di 
pop bx 
add bx,n 
inc bx 
dec bp  
mov cx,n 
mov counter,cx ;counter checks if th columns are over for a raw 


each_row: 
inc bp 
push bx 

inc di 
dec counter 
je -1,new_row 

col:  
mov ah,[bx] 
mov al,[di] 
mul ah 

add [bp],al  
inc bx 
add di,n  
dec column ;this is where the dec instruction stops working  
jnz col  
mov cx,n 
mov column,cx 
pop bx  
dec row 
jnz each_row 


mov ax, 4c00h ; exit to operating system. 
int 21h  
ends 

end start ; set entry point and stop the assembler. 
+2

Что значит «dec'» не работает? » Откуда вы знаете, что это инструкция не работает? Вы пропустили свой код в отладчике? Каково значение столбца после трех итераций цикла? Скорее всего, проблема в том, что на самом деле проблема - это более поздняя инструкция «mov», которая изменяет «столбец» –

+2

. Если вы программируете в сборке, используя хорошо известный ассемблер, не стоит думать, что процессор не делает что-то правильно. Это очень маловероятно. Если CPU не будет обрабатывать DEC правильно, многие, если не большинство программ, будут работать некорректно, и люди уже узнали бы об этом. Если есть ошибка, предположите, что она принадлежит вам, а не процессору. –

+0

Я использую ассемблер 8086, и есть опция, где вы можете увидеть значение переменных, и вот как я вижу, что количество столбцов остается одинаковым, а инструкция dec не работает. я просто переместил значение в регистры, и теперь он работает правильно. кто-нибудь знает, почему это произошло? – cel

ответ

1

Вы поместили буфер с именем результата в разделе данных вашей программы.
В какой-то момент вы хотите сослаться на этот буфер, используя регистр BP. (Вы писали mov bp,offset result В этом и заключается опасность Все адресации памяти с помощью [bp] использует регистр SS сегмента по умолчанию

Решить эту проблему с помощью вашей программы, вставляя префикс замены сегмента в add [bp], al инструкции:.!.

col:  
mov ah,[bx] 
mov al,[di] 
mul ah 
add ds:[bp],al <<<<< See the ds: ? 

Пожалуйста, обратите внимание, что как написать префикс переопределения сегмента ассемблере конкретных Эти и другие возможности:.

add [ds:bp],al 

и:

ds: 
add [bp], al 

dec counter 
je -1,new_row 

Что это своеобразный синтаксис должен делать?