Assembly 检查ax中的位数
我需要找到一种方法来检查ax寄存器中(1)上当前的位数。我想在shl或shr中使用,但我不知道应该如何确切地使用它们。这是我目前的代码:Assembly 检查ax中的位数,assembly,x86,bits,Assembly,X86,Bits,我需要找到一种方法来检查ax寄存器中(1)上当前的位数。我想在shl或shr中使用,但我不知道应该如何确切地使用它们。这是我目前的代码: org 100h mov ax, 0xffffh ;shr ax TO DO int 16h ret 我在某个地方遇到了一个问题,右移功能可以将位向右移动。所以我可能应该通过每次尝试将16位“推”到右边,然后检查LSB1或0标志来使用它?对我来说这听起来是个好主意。移位的位进入CF(进位标志),因此一种解决方案是每次移位后,您都要检查CF=1,然后增加一
org 100h
mov ax, 0xffffh
;shr ax TO DO
int 16h
ret
我在某个地方遇到了一个问题,右移功能可以将位向右移动。所以我可能应该通过每次尝试将16位“推”到右边,然后检查LSB1或0标志来使用它?对我来说这听起来是个好主意。移位的位进入CF(进位标志),因此一种解决方案是每次移位后,您都要检查CF=1,然后增加一个计数变量,该变量将告诉末尾的ON位数。移位的位进入CF(进位标志)因此,一种解决方案是,每次移位后,您都要检查CF=1,然后增加一个计数变量,该变量将告诉末尾的ON位数。使用
popcnt
指令:
popcnt bx,ax
这将
bx
设置为ax中设置的位数。但是,要使此指令可用,您需要一个较新的CPU。使用popcnt
指令:
popcnt bx,ax
这将
bx
设置为ax中设置的位数。不过,要使此指令可用,您需要一个较新的CPU。是的,这是可能的。还要注意的是,shr
将移位的位放入进位标志中,这样您就可以使用adc
轻松地进行计数。当然还有更有效的算法。是的,这是可能的。还要注意的是,shr
将移位的位放入进位标志中,这样您就可以使用adc
轻松地进行计数。当然还有更有效的算法。除了条件跳转和增量之外,您还可以简单地使用立即数为零的adc
。是的,这也可以是一种方法,而不是条件跳转和增量,您也可以简单地使用立即数为零的adc
。是的,这也是一种方法^^