2015-08-20 2 views
0

Получение «A2070 ошибка: недопустимые операнды команд» на следующей инструкции в ассемблере (генерируется из CL)ML недействительные операнды инструкция по сар, ЗЫ

mov edx, DWORD PTR [email protected]@3JA  
shl edx, 1326 ;this line gets the error 

mov ecx, DWORD PTR [email protected]@3JA 
shl ecx, 1514 ;this line gets the error 

mov ecx, DWORD PTR __Var4$74314[ebp] 
sar ecx, 3811 ;this line gets the error  

Это не происходит здесь:

; Line 698 
movsx edx, BYTE PTR [email protected]@3PAHA+4 
movsx ecx, BYTE PTR [email protected]@3PADA+1 
sar edx, cl 

Возможно, что-то связано с тем, что shl, sar используется с константами, а не с регистрами? Confused :(

+2

Это может быть потому, что ваши непосредственные значения слишком высоки для смещения (обычно непосредственное значение находится между '1 <= count <= 31') – Buddy

+0

Вы правы - спасибо sir –

+3

Для инструкций смены немедленное значение представляет собой подписанное 8-битное значение, но только нижние 5 бит являются используется. Ассемблер Microsoft позволит что-то вроде shl edx, 32, которое будет nop. shl edx, 255 или shl edx, -1 или shl edx, 31 сделает то же самое. Ошибка здесь вызвана слишком большим значением для немедленное подписанное 8-битное значение. – rcgldr

ответ

1

Поскольку edx и другие регистры размером 32 бита, сдвигая их на более чем 32 бит, не имеет смысла. Поэтому ассемблер выдает ошибку.

+2

Значение «немедленного» сдвига кодируется в инструкцию. Он не может удерживать требуемое значение. –