gpt4 book ai didi

c++ - 汇编最大整数除法

转载 作者:太空狗 更新时间:2023-10-29 21:47:10 24 4
gpt4 key购买 nike

我有以下程序,它正在获取 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 除以二,模应该为 0。

所以在结果中我应该得到:1073741824.00,但如您所见,它并没有发生..

最佳答案

您将 2^31 符号扩展为 64 位,这意味着它变为 0xffffffff80000000,除以 2(使用无符号算术)会导致溢出。显然你的输入是无符号的,所以你应该使用零扩展(即清除 edx)。这样它就产生了预期的输出:

$ ./a.out
Divide : 2147483648 / 2 = 1073741824.00

关于c++ - 汇编最大整数除法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13674615/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com