2010-02-15 6 views
1

는 내가 .. Cygwin에서와부동 소수점 - 절대 값 - 인라인 어셈블리 - 편집 새로운 코드

I를 GCC 인라인 어셈블리를 사용하고 난 인수의 절대 값을 반환 할 absD라는 함수 .. 를 썼다 왜 작동하지 않는지 보지 마라. 메모리에로드 중입니다. 그렇다면 st (0) 어디서 fabs를 사용하고 있습니까? - 절대 값. 메모리를 할당해야합니까?

저는 C로 어셈블리를 배우려고 노력하고 있습니다. 제발 잘 도와주세요. 여기

#include <stdio.h> 
#include <stdlib.h> 
#define PRECISION 3 

double absD (double n) 
{ 


asm(
     "fldl %[nIn]\n" 
     "fabs\n" 
     "fstpl %[nOut]\n" 
     : [nOut] "=m" (n) 
     : [nIn] "m" (n) 
); 



return n; 


} 

int main (int argc, char **argv) 
{ 
double n = 0.0; 

printf("Absolute value\n"); 
if (argc > 1) 
    n = atof(argv[1]); 

printf("abs(%.*f) = %.*f\n", PRECISION, n, PRECISION, absD(n)); 

return 0; 
} 

출력입니다 : 는

이를 heres 코드 다음 오류가 주셔서 감사합니다 ..

~ $ gc a3 
gcc -Wall -g a3.c -o a3 
~ $ ./a3 
Absolute value 
abs(0.000) = 0.000 
~ $ 

는 절대 값을 출력 (outputting)하지

이 ... 감사합니다

+1

이유는 단지 '가 포함되지 ... :이 같은 뭔가 프로그램을 실행할 수 있습니다 math.h'를 사용하고'fabs() '를 사용합니까? 일반적으로 여기에있는 것보다 일반적으로 빠릅니다. 더 빠르게 진행하려면 GCC 고유의 내장 함수'__builtin_fabs()'를 사용하십시오. –

+0

I cant use Math.h –

+0

0의 절대 값은 0입니다. 뭐가 문제 야? –

답변

1

완전히 일하고 있습니다 !! argv에 값을 넣는 것을 잊고 있습니다.

./a3 -1.3

하고 1.3

당신이 여기를 게시하기 전에 수행 된 반환해야

2

fld (%eax)은 "%eax 주소의 값에서 부동 소수점로드"를 의미합니다. 분명히 %eax의 내용은 double이며 float에 대한 포인터가 아니기 때문에 segfault가됩니다.

입력이 스택에 이미 있으므로 (주소가 있기 때문에) 물건을 움직이는 농구대를 뛰어 넘을 필요가 없습니다. %ffloat 의미하지만, 당신은 그것을 double을 제공하고;

double absD(double input) { 
    double output; 
    asm(
      "fldl %[input]\n" 
      "fabs\n" 
      "fstpl %[output]\n" 
      : [output] "=m" (output) 
      : [input] "m" (input) 
    ); 
    return output; 
} 

또한, 당신의 printf 형식이 잘못되었습니다 %g을 사용하고 싶습니다.

+3

당신은'printf'에 대해 틀렸어요. 왜냐하면 varargs 함수이기 때문에, 가변 인자리스트의 일부일 때 항상'double'으로 승격됩니다. '% f'는'double'을 기대합니다. – caf

+0

ephemient -이 doesnt 작동합니다 .. 그 ouputing 0.0 - 그냥 절대 값이 ... –

+0

왜 메모리 피연산자를 사용합니까? asm ("fabs": "t"(input) : "t"(output));'작업을해야하고, 컴파일러가 FP를 레지스터에 남겨 둡니다. 인라인 할 때 바로 사용할 수있는 곳이 있습니다. 이것은 인라인 asm을 완전히 피하는 것보다 효율적이지 않습니다. 왜냐하면 상수 전파와 같은 것을 막기 때문입니다. –