X86 8086计算两个矩阵相乘的程序';行不通

X86 8086计算两个矩阵相乘的程序';行不通,x86,matrix-multiplication,x86-16,X86,Matrix Multiplication,X86 16,我认为我的代码必须正确运行(似乎合乎逻辑),但在最后一个循环中,减量指令不起作用,程序进入无限循环。 这是我的密码: ; 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

我认为我的代码必须正确运行(似乎合乎逻辑),但在最后一个循环中,减量指令不起作用,程序进入无限循环。 这是我的密码:

; 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.

您已将名为result的缓冲区放入程序的数据部分。
在某些时候,您希望使用
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:  ?
以及:



这种特殊的语法应该做什么?

您已将名为result的缓冲区放在程序的数据部分。
在某些情况下,您希望使用
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:  ?
以及:



这个特殊的语法应该做什么?

你说的
dec
不起作用是什么意思?您如何知道该指令不起作用?您是否在调试器中单步执行了代码?循环三次迭代后,
column
的值是多少?更可能的是,问题实际上是后面的
mov
指令,如果您在汇编中使用井道编程,它会修改
column
已知的汇编程序,认为CPU不能正确地处理DEC不是一个好主意。这是不太可能的。如果CPU不能正确处理DEC,即使不是大多数程序,也会有很多程序不能正常工作,人们现在已经发现了。如果有错误,假设是你的,而不是CPU的。我使用的是8086汇编程序,有一个操作你可以看到变量的值,这就是我如何看到列的数量保持不变,dec指令不起作用。我只是将值移动到寄存器,现在它工作正常。有人知道为什么会发生这种情况吗?你可以在调试器中看到,
dec
指令之后,
没有更改?正如鲁迪所说,我觉得这很难相信。我并不惊讶您的代码没有如图所示工作,但我非常怀疑是
dec
指令出了问题。但我无法验证它;我没有8086(或虚拟化8086)要在上测试代码。是的,在dec指令之后,列的值没有更改。您认为
dec
“不工作”是什么意思?您如何知道该指令不起作用?您是否在调试器中单步执行了代码?循环三次迭代后,
column
的值是多少?更可能的是,问题实际上是后面的
mov
指令,如果您在汇编中使用井道编程,它会修改
column
已知的汇编程序,认为CPU不能正确地处理DEC不是一个好主意。这是不太可能的。如果CPU不能正确处理DEC,即使不是大多数程序,也会有很多程序不能正常工作,人们现在已经发现了。如果有错误,假设是你的,而不是CPU的。我使用的是8086汇编程序,有一个操作你可以看到变量的值,这就是我如何看到列的数量保持不变,dec指令不起作用。我只是将值移动到寄存器,现在它工作正常。有人知道为什么会发生这种情况吗?你可以在调试器中看到,
dec
指令之后,
没有更改?正如鲁迪所说,我觉得这很难相信。我并不惊讶您的代码没有如图所示工作,但我非常怀疑是
dec
指令出了问题。但我无法验证它;我没有8086(或虚拟化8086)要在.yes上测试代码,在dec指令之后,列的值不会立即更改。
ds:
add [bp], al
dec counter
je -1,new_row