为什么会出现这些错误? (大会86)矩阵乘法 [英] Why Am I getting These Errors? (Assembly x86) Matrix Multiplication

查看:93
本文介绍了为什么会出现这些错误? (大会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','!',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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆