C++ 汇编最大整数除法
我有下面的程序,它得到2个无符号长数字(%u),x和y, 然后将x除以y,并以以下格式打印结果:仅x.YZ 它适用于所有常规输入,例如:3/4=0.75、10/5=2.00、19/1000=0.01等等。 但是当我尝试2^31/2时,我得到一个“核心转储”错误。 (2^31=2147483648) 你知道为什么吗?我想我在某个地方得到了垃圾值,但不知道在哪里,为什么C++ 汇编最大整数除法,c++,c,assembly,x86,C++,C,Assembly,X86,我有下面的程序,它得到2个无符号长数字(%u),x和y, 然后将x除以y,并以以下格式打印结果:仅x.YZ 它适用于所有常规输入,例如:3/4=0.75、10/5=2.00、19/1000=0.01等等。 但是当我尝试2^31/2时,我得到一个“核心转储”错误。 (2^31=2147483648) 你知道为什么吗?我想我在某个地方得到了垃圾值,但不知道在哪里,为什么 format: .string "Divide : %u / %u = %u.%.2d\n" # operation divid
format: .string "Divide : %u / %u = %u.%.2d\n"
# operation divide
movl %ebx, %eax #%eax=x
cltd #sign extend eax to edx
divl %esi #x=x/y
pushl %eax #save %eax on stack
movl %edx, %eax #%eax=xmody
cltd #sign extend eax to edx
movl $100, %ecx #%ecx=100
mull %ecx #multiply xmody by 100
divl %esi #divide by y
movl %eax, %edx
popl %eax
pushl %edx
pushl %eax #push x/y
pushl %esi #push y
pushl %ebx #push x
pushl $format
call printf
非常感谢D
编辑:
为了澄清,我希望1073741824(这是除法的结果)在%eax上,因为2147483648除以2,所以模应该是0
因此,在结果中我应该得到:1073741824.00,但正如您所看到的,它没有发生。您将2^31扩展到64位,这意味着它变成0xFFFFFF8000000,当除以2(使用无符号算术)时,会导致溢出。显然,您的输入是无符号的,所以您应该使用零扩展名(即,只需清除
edx
)。由此产生预期输出:
$ ./a.out
Divide : 2147483648 / 2 = 1073741824.00