【发布时间】:2016-10-15 18:23:47
【问题描述】:
我想检查寄存器 ax 的值是否能被 7 整除,余数 = 0。我该怎么做?
【问题讨论】:
-
应该将AX中的值视为有符号还是无符号?您是否仅限于 16 位模式,如果是,为什么?使用 IDIV 的答案是否可以接受,或者您是否正在寻找避免(慢)硬件除法指令的巧妙技巧?为什么你首先要手动编写汇编语言?
标签: math assembly x86 division
我想检查寄存器 ax 的值是否能被 7 整除,余数 = 0。我该怎么做?
【问题讨论】:
标签: math assembly x86 division
您可以使用与this answer 相同的方式,当然可以使用不同的常量。
7 mod 216 的模乘逆是 0x6db7,这(根据定义)意味着 x = n * 7 形式的数字将服从 x * 0x6db7 = n,其中 n 将小于或等于0xffff / 7。所以如果你从x * 0x6db7 中得到更大的东西,你知道它不是 7 的倍数。此外,非 7 的倍数也不能映射到低结果,因为乘以奇数模 2 的幂是双射的。
所以你可以使用(未测试)
imul ax, ax, 0x6db7
cmp ax, 0x2492
ja not_multiple_of_7
这当然适用于无符号数。
作为奖励,ax 将是原始值除以 7 当它是 7 的倍数。
【讨论】:
org 100h
mov ax,14
mov cl,7
div cl
cmp ah,0
je positive
PRINTN "The number has a remainder"
jmp finish
positive:
PRINTN "The number has no remainder"
finish:
PRINTN "After comparison"
mov ah, 0
int 16h
ret
【讨论】: