对于大量x86汇编,乘法返回错误的值

时间:2019-04-13 16:26:59

标签: assembly x86

我试图用C编写一个简单的程序(使用extern汇编函数),该程序将kg转换为磅。这是C语言中的函数及其调用方式:

extern int convert(int value, int factor);

printf("Value in Pounds: %lf\n", convert(value, 2205)/1000.0); // doing division in C since I could not figure out how to work with floating point in assembler

但是,如果“ value”参数太大(我希望它以9位整数形式工作),则计算出的值不正确。我该如何解决该问题? 这是汇编代码:

.globl _convert

_convert:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax # get value
movl 12(%ebp), %ecx # get factor
mull %ecx
movl %ebp, %esp
popl %ebp
ret

我还尝试编写循环,该循环迭代“因数”次数并为其自身添加“值”,但是得到相同的结果。

1 个答案:

答案 0 :(得分:1)

9位数字太大,因为999999999·2.20642> 2 ^ 31,所以它将为负数。请改用无符号32位整数,或将输入限制为最多974083355。

您也可以尝试使用3个参数,以便转换因子是整数分数,以提高准确性:

extern unsigned int convert(int value, int numerator, int denominator);

    convert(num, 220462, 100000);


        .globl  _convert
_convert:
        pushl   %ebp
        movl    %esp, %ebp
        movl    8(%ebp), %eax  # get value
        movl    12(%ebp), %ecx # get numerator
        mull    %ecx           # edx:eax = product
        movl    16(%ebp), %ecx # get denominator
        divl    %ecx           # eax = quotient
        add     %edx,%edx      # round
        cmp     %ecx,%edx
        cmc
        adc     0,%eax
        movl    %ebp, %esp
        popl    %ebp
        ret