Assembly 在x86汇编中使用整数除法处理百分比

Assembly 在x86汇编中使用整数除法处理百分比,assembly,x86,att,integer-division,Assembly,X86,Att,Integer Division,我在汇编(x86)和百分比方面工作。我的问题如下: 我有一个代表100%的值 我计算total_sum/100得到代表1%的值: xorl %edx, %edx movl total_sum, %eax movl $100, %ecx divl %ecx 稍后在我的程序中,我使用此除法的结果来计算由其他值表示的百分比 使用计算器(浮点)完成的计算示例: 515代表100%,506代表什么百分比 515/100=5.15 506/5.15=98.25 这意味着:506约占515的98% 不幸的是

我在汇编(x86)和百分比方面工作。我的问题如下:

我有一个代表100%的值

我计算
total_sum/100
得到代表1%的值:

xorl %edx, %edx
movl total_sum, %eax
movl $100, %ecx
divl %ecx
稍后在我的程序中,我使用此除法的结果来计算由其他值表示的百分比

使用计算器(浮点)完成的计算示例:

515代表100%,506代表什么百分比

515/100=5.15
506/5.15=98.25

这意味着:506约占515的98%

不幸的是,使用汇编语言和整数算术,计算结果如下所示:

515/100=5
506/5=101

这意味着506代表515的101%

但是,我不希望结果>100%

我试图使用第一个除法的
%edx
中的值进行一些更正。但是,四舍五入
%eax
(如果
%edx
表示小数点后的第一个数字是5或更多,则递增)没有多大帮助


我如何确保我得到的值不超过100%?

我完全编辑了你的问题,因为它不容易理解。我希望我完全理解你的问题,这个问题仍然在问你想问什么

您所描述的问题实际上不是汇编语言问题,而是与任何可以执行整数算术的编程语言(如C/C++、Java、Pascal和许多其他语言)相关的问题

因此,我从您的问题中删除了
x86
标记,并添加了
整数除法
标记

以下尝试:

我试图使用第一个除法的
%edx
中的值进行一些更正。但是,舍入
%eax
。。。没有多大帮助

这对你没有帮助。让我们看一下您稍后执行的第二个计算:

570/5=114
570/6=95
510/5=102
510/6=85

因此,如果第一次除法的(校正)结果为5,则值510将被计算为102%,尽管为510515

这意味着不存在表示1%的整数
one_percent
,在执行操作
percentage=number/one_percent
时,该整数将给出正确的结果

您唯一的机会是在程序结束时执行以下计算

percentage = (100 * number) / total_sum
请注意,在使用整数算术时,的运算顺序几乎总是很重要的。因此,以下计算不会给出与上述计算相同的结果:

percentage = 100 * (number / total_sum)
使用汇编语言,可以按以下方式进行第一次计算:

mov $100, %edx
mov some_number, %eax
mull %edx
  ; Now (edx:eax) contains the 64-bit value (100*some_number)
mov total_sum, %ecx
divl %ecx
  ; Now eax contains the 32-bit value (100*some_number)/total_sum

我完全编辑了你的问题,因为它不容易理解。我希望我完全理解你的问题,这个问题仍然在问你想问什么

您所描述的问题实际上不是汇编语言问题,而是与任何可以执行整数算术的编程语言(如C/C++、Java、Pascal和许多其他语言)相关的问题

因此,我从您的问题中删除了
x86
标记,并添加了
整数除法
标记

以下尝试:

我试图使用第一个除法的
%edx
中的值进行一些更正。但是,舍入
%eax
。。。没有多大帮助

这对你没有帮助。让我们看一下您稍后执行的第二个计算:

570/5=114
570/6=95
510/5=102
510/6=85

因此,如果第一次除法的(校正)结果为5,则值510将被计算为102%,尽管为510515

这意味着不存在表示1%的整数
one_percent
,在执行操作
percentage=number/one_percent
时,该整数将给出正确的结果

您唯一的机会是在程序结束时执行以下计算

percentage = (100 * number) / total_sum
请注意,在使用整数算术时,的运算顺序几乎总是很重要的。因此,以下计算不会给出与上述计算相同的结果:

percentage = 100 * (number / total_sum)
使用汇编语言,可以按以下方式进行第一次计算:

mov $100, %edx
mov some_number, %eax
mull %edx
  ; Now (edx:eax) contains the 64-bit value (100*some_number)
mov total_sum, %ecx
divl %ecx
  ; Now eax contains the 32-bit value (100*some_number)/total_sum

请包括将数字相加为总和的代码,并包括一组示例值。根据描述,如果值不是太大,您可以将它们乘以10的某个幂,可能是10000或1000000,然后适当地除以。需要有关以后计算的更多信息。一般来说分割会导致精度损失,因此您希望将所有分割推迟到尽可能晚的时间-例如,不要在
a=b*k
之后更早地执行类似
k=total/100
的操作,您可能无法在
a=(b*total)之前执行任何操作/100
稍后。@Brendan我编辑了这个问题,因为我想我已经理解OP想要问什么了。但是,问题比您想象的还要严重:OP执行两次除法(都有精度损失),而不是一次乘法和一次除法。8086还是X86?它们不一样(506*100)/515会给出您想要的结果。整数除法与连续实数不一样。请包含将数字相加为总和的代码,并包含一组示例值。根据描述,如果值不是太大,您可以将它们乘以10的某个幂,可能是10000或1000000,然后适当地除以。需要有关以后计算的更多信息。一般来说分割会导致精度损失,因此您希望将所有分割推迟到尽可能晚的时间-例如,而不是执行<代码>之类的操作