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

时间:2019-05-20 22:27:28

标签: assembly x86 att integer-division

我正在装配(x86)中工作,并且正在使用百分比。我的问题是以下问题:

我有一些值total_sum代表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%?

1 个答案:

答案 0 :(得分:2)

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

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

因此,我从您的问题中删除了x86标签,并添加了integer-division标签。

以下尝试:

  

我正在尝试使用第一级的%edx中的值进行一些更正。但是,舍入%eax ...并没有太大帮助。

不会帮助您。让我们看一下稍后要执行的第二次计算:

  

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

因此,如果第一部分的(校正后)结果为5,尽管510 <515,值510仍将被计算为102%。

如果第一部分的(校正后)结果为6,则尽管570> 515,值570仍将被计算为95%。

这意味着不存在表示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