Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 如何计算寄存器eax(程序集x86)中数字的位数_Assembly_X86 - Fatal编程技术网

Assembly 如何计算寄存器eax(程序集x86)中数字的位数

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

假设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
   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、 把你的代码卷成一个循环。