Assembly 如何计算寄存器eax(程序集x86)中数字的位数
假设eax中有大约970个数字 我试着用这个来计算数字Assembly 如何计算寄存器eax(程序集x86)中数字的位数,assembly,x86,Assembly,X86,假设eax中有大约970个数字 我试着用这个来计算数字 mov ebx, 10 mov ecx, 0 labelDivider: inc ecx cdq idiv ebx cmp eax, 0 jnz labelDivider 结果值应放在ecx中,并且在一个结果中,我始终有1,而不是3或其他(如果我更改初始数字)。如果要避免在旧处理器上速度较慢的除法,则可以使用另一种方法,假设EAX中的输入数是无符号整数: MOV ECX,1 CMP EAX,9 JNA Done
mov ebx, 10
mov ecx, 0
labelDivider:
inc ecx
cdq
idiv ebx
cmp eax, 0
jnz labelDivider
结果值应放在ecx中,并且在一个结果中,我始终有1,而不是3或其他(如果我更改初始数字)。如果要避免在旧处理器上速度较慢的除法,则可以使用另一种方法,假设EAX中的输入数是无符号整数:
MOV ECX,1
CMP EAX,9
JNA Done
INC ECX
CMP EAX,99
JNA Done
INC ECX
CMP EAX,999
JNA Done
INC ECX
CMP EAX,9999
JNA Done
INC ECX
CMP EAX,99999
JNA Done
INC ECX
CMP EAX,999999
JNA Done
INC ECX
CMP EAX,9999999
JNA Done
INC ECX
CMP EAX,99999999
JNA Done
INC ECX
CMP EAX,999999999
JNA Done
INC ECX
Done: ; Number of decimal digits is in ECX.
如果要避免在旧处理器上速度较慢的除法,可以使用另一种方法,假设EAX中的输入数是无符号整数:
MOV ECX,1
CMP EAX,9
JNA Done
INC ECX
CMP EAX,99
JNA Done
INC ECX
CMP EAX,999
JNA Done
INC ECX
CMP EAX,9999
JNA Done
INC ECX
CMP EAX,99999
JNA Done
INC ECX
CMP EAX,999999
JNA Done
INC ECX
CMP EAX,9999999
JNA Done
INC ECX
CMP EAX,99999999
JNA Done
INC ECX
CMP EAX,999999999
JNA Done
INC ECX
Done: ; Number of decimal digits is in ECX.
如图所示的代码确实在
ecx
中正确地生成了3
。请尝试单步执行调试器以查看它正在执行的操作。它对我来说工作正常。错误可能在代码的其他部分。请发布一个。如果您实际上不需要十进制数字,那么乘以10(从1开始)和cmp eax,ecx
/jae.loop
比除以原始数字要快得多。但是如果你这样做了,那么在保存它们的过程中,你可以将它们复制到你最终想要的任何地方,同时计算出它们的数量。如图所示的代码确实在ecx
中正确地生成了3
。请尝试单步执行调试器以查看它正在执行的操作。它对我来说工作正常。错误可能在代码的其他部分。请发布一个。如果您实际上不需要十进制数字,那么乘以10(从1开始)和cmp eax,ecx
/jae.loop
比除以原始数字要快得多。但是如果你这样做了,那么在保存它们的过程中,你可以将它们复制到你最终想要的任何地方,同时计算出它们的数量。或者使用bsr
,以及一个带有计数和比较阈值的查找表,以确定是否还有一个十进制数字。或者另一种方法是在一个循环中将某个数乘以10,使用lea-edx,[edx+edx*4]
/添加edx,edx
。(从10开始,任何小于10的数字都有1位数字)。i、 e.将代码汇总到循环中。或使用bsr
,以及一个带有计数和比较阈值的查找表,以确定是否还有一个十进制数字。或者另一种方法是在一个循环中将某个数乘以10,使用lea-edx,[edx+edx*4]
/添加edx,edx
。(从10开始,任何小于10的数字都有1位数字)。i、 把你的代码卷成一个循环。