Почему я получаю эти ошибки? (Сборка x86) Умножение матриц - PullRequest
0 голосов
/ 14 ноября 2011

Так что да, еще одна домашняя проблема. Но я действительно думал, что прибил это на этот раз .. В любом случае я получаю 4 ошибки, которые, кажется, не имеют никакого смысла для меня O_O или, может быть, это просто мой слепой взгляд или мое жалкое оправдание для кода Но да. Я получаю эти ошибки

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

Назначение на этот раз - создать код сборки для умножения матриц. Я вставлю свой код и выделю строки 70, 77, 83 и 90

Я мог бы вставить длинный набор кодов, но все, что мне нужно знать, это то, почему я получаю эти ошибки. Он должен быть того же типа, я не знаю, почему он не работает ...

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

Строки 70, 77, 83 и 90 находятся внутри ** ** Я не знаю почему, но я пытался сделать их жирным шрифтом, чтобы он был заметен :( Я не знаю, почему это не так В любом случае, весь этот код в основном переписан моей программой умножения матриц C

Который я вставлю сюда

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");
  }
}

Ответы [ 2 ]

2 голосов
/ 14 ноября 2011

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
1 голос
/ 14 ноября 2011

Прошло какое-то время с того момента, как я кодировал ассемблер 80x86, но разве код операции MUL не принимает только один операнд и неявно использует аккумулятор (EAX) в качестве одного из терминов, а EAX + EDX для хранения результатов? (Конечно, когда я программировал на ассемблере, это были просто старые AX и DX: ни одна из этих причудливых 32- или 64-битных вещей для нас!)

...