Nasm - Imul 不起作用
Nasm - Imul doesn't work
我创建了一个计算阶乘的程序。一切都应该没问题,除了乘法。我不知道我犯了什么样的错误。下面我将向您展示一个调试器语句:
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
如有必要,我可以post程序的其余部分。
英特尔手册列出了 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 位寄存器作为操作数,但是正如您在上面看到的那样 table IMUL
没有这样的变体。
你可以这样做:
mov al,dil
imul sil
; The result will be in AX
我创建了一个计算阶乘的程序。一切都应该没问题,除了乘法。我不知道我犯了什么样的错误。下面我将向您展示一个调试器语句:
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
如有必要,我可以post程序的其余部分。
英特尔手册列出了 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 位寄存器作为操作数,但是正如您在上面看到的那样 table IMUL
没有这样的变体。
你可以这样做:
mov al,dil
imul sil
; The result will be in AX