Так что да, еще одна домашняя проблема. Но я действительно думал, что прибил это на этот раз .. В любом случае я получаю 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");
}
}