我试图用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
我还尝试编写循环,该循环迭代“因数”次数并为其自身添加“值”,但是得到相同的结果。
答案 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