为什么会出现这些错误? (大会86)矩阵乘法

编程入门 行业动态 更新时间:2024-10-10 00:20:24
本文介绍了为什么会出现这些错误? (大会86)矩阵乘法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

所以是另一个家庭作业的问题。但我真的以为我钉这一次..反正我得到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','!',0SOUT DB%S,10,0段的.text    全球MATMULMATMUL:    进入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 / M8MUL R / M16    DX:AX←AX * R / M16MUL R / M32    EDX:EAX←EAX * R / M32MUL 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)矩阵乘法

本文发布于:2023-11-27 23:59:20,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1640137.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:乘法   矩阵   错误   大会

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!