为什么会出现这些错误? (大会86)矩阵乘法 [英] Why Am I getting These Errors? (Assembly x86) Matrix Multiplication
问题描述
所以是另一个家庭作业的问题。但我真的以为我钉这一次..反正我得到4的错误,似乎没有任何意义,我O_O也许这只是我视而不见还是我的code可悲的借口,但是,是的。我得到这些错误
mp5.s:70:错误:OP code和操作数的组合无效
mp5.s:77:错误:OP code和操作数的组合无效
mp5.s:83:错误:OP code和操作数的组合无效
mp5.s:90:错误:OP code和操作数的组合无效
分配这时间,使装配code做矩阵乘法。我会贴上我的code和突出线条70,77,83,90
我可能会粘贴一个很长一串codeS,但所有我需要知道的是为什么我得到这些错误我。它应该是同一类型的,我不知道为什么它不工作...
的extern的printf段。数据test1的分贝'M','我','S','M','A','T','C','H',0
测试2分贝'H','E','L','L','O','!',0
SOUT DB%S,10,0段的.text 全球MATMUL
MATMUL:
进入12,0 MOV EAX,0
MOV [EBP-04],EAX; I = 0
MOV [EBP-08],EAX; J = 0
MOV [EBP-12],EAX; K = 0 MOV EAX,[EBP + 24]
MOV EBX,[EBP + 28]
CMP EAX,EBX
济启动 ;;当矩阵可以知道B乘以它打印出不匹配,然后退出
推TEST1
推SOUT
调用printf
JMP完成;;;开始我环路
开始:
ILOOP:
MOV EAX,[EBP-04]
MOV EBX,[EBP + 20]
CMP EAX,EBX;而I< xrow不断循环
JE完成 INC EAX
MOV [EBP-04],EAX; i递增++
jloop:
;; j循环从这里开始
MOV EAX,[EBP-8]
MOV EBX,[EBP + 32]
CMP EAX,EBX;而J< ycol不断循环
JE resetJ INC EAX
MOV EAX,[EBP-08];增加J ++
kloop:
;; ķ循环从这里开始
MOV EAX,[EBP-12]
MOV EBX,[EBP + 24]
CMP EAX,EBX;而K< XCOL保持loopinbg
JE resetK ;;操作开始
MOV ESI,[EBP + 8];基质1的地址
MOV EDI,[EBP + 12];矩阵2的地址 MOV EAX,[EBP-04]
MOV EBX,[EBP-12]
MOV ECX,[EBP + 24]
** MUL ECX,EAX; XCOL * **我
加ECX,EBX; XCOL * I + K
加ESI,ECX; ESI +现在转向ESI有x的位置[COL * I + K] MOV EAX,[EBP-12]
MOV EBX,[EBP-08]
MOV ECX,[EBP + 32]
** MUL ECX,EAX; ycol * K **
加ECX,EBX; ycol * K + J
加入EDI,ECX; EDI +现在转向ESI有位置Y [COL * K + J]。 MOV EDX,[ESI]; EDX< - 都是我们所需要的价值
MOV EAX,[EDI],EAX< - 都是我们所需要的第二个值
** MUL EDX,EAX; X [XCOL * I + K * Y [ycol * 1 + K] = EDX ** MOV ESI,[EBP + 16]; ESI现在有第三个矩阵的第一位置 MOV EAX,[EBP-04]
MOV EBX,[EBP-08]
MOV ECX,[EBP + 28]
** MUL ECX,EAX; yrow * **我
加ECX,EBX; yrow * I + J
加ESI,ECX; ESI + ESI现在已经转移的位置Z [yrow * I + J]
MOV EAX,[ESI]; EAX< - [ESI] 添加EAX,EDX; Z [yrow * I + J] + X [XCOL * I + K * Y [ycol * K + J] = EAX;
MOV [ESI],EDX
;;操作结束 MOV EAX,[EBP-12]
INC EAX
MOV EAX,[EBP-12];增量ķ++
JMP kloop; k循环
JMP jloop; j循环
JMP ILOOP;我重新开始循环
resetJ:
MOV EAX,0
MOV [EBP-08],EAX
JMP ILOOPresetK:
MOV EAX,0
MOV [EBP-12],EAX
JMP jloop完成:
离开
RET测试:
推TEST2
推SOUT
调用printf
JMP完成
70号线,77,83,90在里面的那些**,我不知道为什么,但我试图让他们粗体所以它noticable :(我不知道为什么它不工作的。不管怎么说这整个code基本上是我的C矩阵乘法程序的重写
我将在这里贴
无效毫米(INT * X,诠释* Y,诠释* Z,诠释xrow,诠释XCOL,诠释yrow,诠释ycol){
如果(XCOL == yrow){
INT I,J,K; 对于(i = 0; I< xrow;我++){
为(J = 0; J< ycol; J ++){
对于(K = 0; K< XCOL; k ++){
Z [yrow * I + J] = Z [yrow * I + J] + X [XCOL * I + K * Y [ycol * K + J]。
}
}
} } 其他{
的printf(大小不匹配无法复制\\ n);
}
}
MUL
,无符号乘法,有以下几种形式(Intel语法):
MUL R / M8
AX←AL * R / M8
MUL R / M16
DX:AX←AX * R / M16
MUL R / M32
EDX:EAX←EAX * R / M32
MUL R / M64
RDX:RAX←RAX * R / M64
So yeah Another Homework problem. But I really thought I nailed it this time.. Anyways I'm getting 4 errors that Doesn't seem to make any sense for me O_O or maybe it's just my blind eye or my pathetic excuse for a code But yeah. I'm getting these errors
mp5.s:70: error: invalid combination of opcode and operands
mp5.s:77: error: invalid combination of opcode and operands
mp5.s:83: error: invalid combination of opcode and operands
mp5.s:90: error: invalid combination of opcode and operands
The assignment this time Is to make an assembly code to do matrix multiplication. I'll paste my code and highlight lines 70, 77, 83, and 90
I might paste a long bunch of codes but all i need to know is why i'm getting these errors. It should be of the same type I don't know why it's not working...
extern printf
segment .data
test1 db 'M','i','s','m','a','t','c','h',0
test2 db 'h','e','l','l','o','!',0
sout db "%s", 10, 0
segment .text
global matMul
matMul:
enter 12,0
mov eax, 0
mov [ebp-04], eax ;i=0
mov [ebp-08], eax ;j=0
mov [ebp-12], eax ;k=0
mov eax, [ebp+24]
mov ebx, [ebp+28]
cmp eax, ebx
je start
;; When The Matrices can't b multiplied It prints out "Mismatch" then exits
push test1
push sout
call printf
jmp done
;;; start with I loop
start:
iloop:
mov eax, [ebp-04]
mov ebx, [ebp+20]
cmp eax, ebx ;while i < xrow keep looping
je done
inc eax
mov [ebp-04], eax ;increments i++
jloop:
;; j loop starts here
mov eax, [ebp-8]
mov ebx, [ebp+32]
cmp eax, ebx ;while j < ycol keep looping
je resetJ
inc eax
mov eax, [ebp-08] ;increments j++
kloop:
;; k loop starts here
mov eax, [ebp-12]
mov ebx, [ebp+24]
cmp eax, ebx ;while k < xcol keep loopinbg
je resetK
;; operation starts
mov esi, [ebp+8] ;address of the matrix 1
mov edi, [ebp+12] ;address of matrix 2
mov eax, [ebp-04]
mov ebx, [ebp-12]
mov ecx, [ebp+24]
**mul ecx, eax ;xcol * i**
add ecx, ebx ;xcol * i + k
add esi, ecx ;esi + shift now esi have the location for x[col*i+k]
mov eax, [ebp-12]
mov ebx, [ebp-08]
mov ecx, [ebp+32]
**mul ecx, eax ;ycol * k**
add ecx, ebx ;ycol * k + j
add edi, ecx ;edi + shift now esi have the location for y[col*k + j]
mov edx, [esi] ;edx <- have the value we need
mov eax, [edi] ;eax <- have the 2nd value we need
**mul edx, eax ;x[xcol * i + k] * y[ycol * 1 + k] = edx**
mov esi, [ebp+16] ;esi now have the first location of the 3rd matrix
mov eax, [ebp-04]
mov ebx, [ebp-08]
mov ecx, [ebp+28]
**mul ecx, eax ;yrow * i**
add ecx, ebx ;yrow * i + j
add esi, ecx ;esi + shift now esi have the location for z[yrow * i + j]
mov eax, [esi] ;eax <- [esi]
add eax, edx ;z[yrow * i + j] + x[xcol * i + k] * y[ycol * k + j] = eax;
mov [esi], edx
;; operation end
mov eax, [ebp-12]
inc eax
mov eax, [ebp-12] ;increment k++
jmp kloop ;k loop
jmp jloop ;j loop
jmp iloop ;i loop back to start
resetJ:
mov eax, 0
mov [ebp-08], eax
jmp iloop
resetK:
mov eax, 0
mov [ebp-12], eax
jmp jloop
done:
leave
ret
testing:
push test2
push sout
call printf
jmp done
Line 70, 77, 83, and 90 are the ones inside ** ** I don't know why but I was trying to make them Bold font so it's noticable :( I don't know why It doesn't work either. Anyways this whole code is basically a rewrite of my C matrix multiplication program
Which I'll paste here
void mm(int *x, int *y, int *z, int xrow, int xcol, int yrow, int ycol){
if(xcol == yrow){
int i,j,k;
for(i = 0; i < xrow; i++){
for(j = 0; j < ycol; j++){
for(k = 0; k < xcol; k++){
z[yrow * i + j] = z[yrow * i + j] + x[xcol * i + k] * y[ycol * k + j];
}
}
}
}
else{
printf("Size Mismatch. Can't Multiply.\n");
}
}
MUL
, unsigned multiply, has the following forms (Intel syntax):
MUL r/m8
AX ← AL∗ r/m8
MUL r/m16
DX:AX ← AX ∗ r/m16
MUL r/m32
EDX:EAX ← EAX ∗ r/m32
MUL r/m64
RDX:RAX ← RAX ∗ r/m64
这篇关于为什么会出现这些错误? (大会86)矩阵乘法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!