x86汇编程序中是否存在模运算符?
答案 0 :(得分:63)
DIV
指令(对于带符号的数字,它的对应IDIV
)给出商和余数(模数)。 DIV r16
将DX:AX
中的32位数字除以16位操作数,并将商存储在AX
中,余数存储在DX
中。
示例:
mov dx, 0
mov ax, 1234
mov bx, 10
div bx ; Divides 1234 by 10. DX = 4 and AX = 123
在32位汇编中,您可以div ebx
将EDX:EAX
中的64位操作数除以EBX
。有关详细信息,请参阅英特尔Architectures Software Developer’s Manuals。
答案 1 :(得分:22)
如果计算模2的幂,则使用按位AND更简单,并且通常比执行除法更快。如果b
是2的幂,a % b == a & (b - 1)
。
例如,让我们在寄存器 EAX,modulo 64 中取一个值。
最简单的方法是AND EAX, 63
,因为63是二进制的111111。
屏蔽的高位数对我们不感兴趣。试试吧!
类似地,不是使用功率为2的MUL或DIV,而是使用位移。但要注意签名的整数!
答案 2 :(得分:1)
查看模数运算符在各种体系结构上的外观的简单方法是使用Godbolt编译器资源管理器。
答案 3 :(得分:0)
如果您不太在意性能,而是想使用简单的方法,则可以使用DIV
或IDIV
。
DIV
或IDIV
仅将一个操作数除以
该操作数的某个寄存器,操作数可以
只能注册或存储位置。
当操作数是字节时: AL = AL /操作数,AH =余数(模数)。
例如:
MOV AL,31h ; Al = 31h
DIV BL ; Al (quotient)= 08h, Ah(remainder)= 01h
当操作数是单词时: AX =(AX)/操作数,DX =余数(模数)。
例如:
MOV AX,9031h ; Ax = 9031h
DIV BX ; Ax=1808h & Dx(remainder)= 01h