Задание: Разработать подпрограмму (на ассемблере) суммирования двух матриц 8х8 и последующего умножения полученной суммы на число 13, т.е. С = (А + В) * 13. Элементы исходных матриц — 8-разрядные знаковые числа. Элементы результирующей матрицы — 16-разрядные знаковые числа. Суммирование элементов матриц произвести с учетом насыщения. За один цикл процедуры ММХ обрабатываются 2 строки матрицы. Вот то, что надумал я:
...
void MUL_M8x8(signed char *matrInA,signed char *matrInB,unsigned char multIn,signed short *matrOutC)
{
__asm
{
mov eax,matrInA
mov ebx,matrInB
mov edx,matrOutC
mov ecx,4
Loop1:
;Секция ММХ команд
movd mm5,multIn ;где-то
punpckldq mm5,mm5 ;здесь ошибка (в этих двух строчках)
movq mm0,[eax]
movq mm1,[eax]+8
movq mm2,[ebx]
movq mm3,[ebx]+8
paddsb mm0,mm2
paddsb mm1,mm3
pmullw mm0,mm6
pmullw mm1,mm6
movq [eax],mm0
movq [eax]+8,mm1
add eax,16
add ebx,16
loop Loop1
Emms ; закончить MMX состояние
Ret 0
}
}
Компилятор выдает ошибку, связанную с несоответствием типов. Проще говоря, требуется преобразовать данные типа unsigned char (multIn) в данные типа word или dword. Помогите бездарному студенту)).
Матрицы, ассемблер
Модераторы: Хыиуду, MOTOCoder, Medved, dr.Jekill
Во-первых, multIn объявлен как unsigned char, т.е. 1 байт. Т.е. такая инструкция недопустима
В вашем случае можно сделать так
А вот между прочим существуют еще специально заточенные регистры esi, edi - для адресов источника и назначения, и использование регистров общего назначения в качестве косвенной адрессации без необходимости считается дурным тоном. Хотелось бы посмотреть на удивленные лица нынешних студентов, почему нельзя писать так
Но это так, отступление... Во-вторых
Код: Выделить всё
movd mm5, multIn
Код: Выделить всё
movzx eax, multIn
movd mm5, eax
Код: Выделить всё
mov bx, [ax]
подразумевается скорее всего mm5, потому что mm6 не проинициализирован... в сам код особо не вникал, просто то что бросилось в глаза" писал(а):pmullw mm0,mm6
pmullw mm1,mm6
It's a long way to the top if you wanna rock'n'roll
Спасибо за понимание и за помощь.