汇编中如何求两个整数的商的最大值

3
我有以下程序,它会获取两个无符号长整型数字(%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,但正如您所见,这并没有发生。
1个回答

2
你需要对2^31进行符号扩展,这意味着它变成了0xffffffff80000000,当使用无符号算术除以2时会导致溢出。显然,你的输入是无符号的,因此应该使用零扩展(即只清除edx)。这样就可以产生预期的输出:
$ ./a.out
Divide : 2147483648 / 2 = 1073741824.00

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接