2015-01-06 2 views
0

Я создал программу, которая учитывает факториал. Все должно быть хорошо, кроме умножения. Я понятия не имею, какую ошибку я совершил. Ниже я покажу вам отладчик заявление:Nasm - Imul не работает

error: invalid combination of opcode and operands 

часть программы включает в себя умножение (IMUL):

_middle: 
cmp dil,1 ;; dil is the counter, sil contain the final result 
jl _end 
imul sil,dil ;; here is the problem 
dec dil 
jmp _middle 

В случае необходимости, я могу отправить остальную часть программы.

ответ

0

Процессора Intel руководства перечисляет следующие варианты IMUL:

F6 /5   IMUL r/m8*  M Valid Valid AX? AL * r/m byte. 
F7 /5   IMUL r/m16  M Valid Valid DX:AX ? AX * r/m word. 
F7 /5   IMUL r/m32  M Valid Valid EDX:EAX ? EAX * r/m32. 
REX.W + F7 /5 IMUL r/m64  M Valid N.E. RDX:RAX ? RAX * r/m64. 
0F AF /r   IMUL r16, r/m16 RM Valid Valid word register ? word register * r/m16. 
0F AF /r   IMUL r32, r/m32 RM Valid Valid doubleword register ? doubleword register * 
r/m32. 
REX.W + 0F AF /r IMUL r64, r/m64 RM Valid N.E. Quadword register ? Quadword register * 
r/m64. 
6B /r ib   IMUL r16, r/m16, imm8 RMI Valid Valid word register ? r/m16 * sign-extended 
immediate byte. 
6B /r ib   IMUL r32, r/m32, imm8 RMI Valid Valid doubleword register ? r/m32 * signextended 
immediate byte. 
REX.W + 6B /r ib IMUL r64, r/m64, imm8 RMI Valid N.E. Quadword register ? r/m64 * sign-extended 
immediate byte. 
69 /r iw   IMUL r16, r/m16, imm16 RMI Valid Valid word register ? r/m16 * immediate word. 
69 /r id   IMUL r32, r/m32, imm32 RMI Valid Valid doubleword register ? r/m32 * immediate 
doubleword. 
REX.W + 69 /r id IMUL r64, r/m64, imm32 RMI Valid N.E. Quadword reg 

Вы снабжающие два 8-битных регистров в качестве операндов, но, как вы можете видеть в таблице выше нет такого варианта IMUL.

Вы могли бы сделать что-то вроде:

mov al,dil 
imul sil 
; The result will be in AX 
Смежные вопросы