我有以下程序,它会获取两个无符号长整型数字(%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)
你有什么想法吗?我猜测我在某个地方得到了垃圾值,但无法找出原因。
非常感谢! :D
编辑: 为了澄清,我希望1073741824(这是除法的结果)在%eax中,因为2147483648可以被2整除,所以余数应该为0。
因此,在结果中我应该得到:1073741824.00,但正如您所见,这并没有发生。
对于所有常规输入,如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,但正如您所见,这并没有发生。