Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.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
C++ 汇编最大整数除法_C++_C_Assembly_X86 - Fatal编程技术网

C++ 汇编最大整数除法

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

我有下面的程序,它得到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 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