2017-05-20 1 views
0

그래서 프로세서가 숫자를 반올림하는 방식을 변경하는 어셈블리 함수를 만들어야합니다. 나는 그걸 가지고있다. 이제 그걸 증명할 필요가있어. 따라서 화면에 값을 쓰려면 1 값이 필요하고 반올림 방법을 변경 한 다음 동일한 값을 쓰고 가장 중요한 mantis 비트가 변경되었는지 확인하십시오. 나는 철과 같은 IEEE 754 형식의 3.14 값을 쓸 수있는 방법 다음 :어셈블리에서 이진수로 부동 소수점 레지스터 값 표시

0 10000000 10010001111010111000011

을 나는 함수가 그것을 밖으로 printf하거나 그것을 반환 할 수 있습니다, 그래서 C.

에서 해당 함수를 호출 할 수 있음을 의미
+0

어셈블리에 해당 함수를 작성 하시겠습니까? 아니면 C? 어떤 아키텍처 및 운영 체제를 프로그래밍하고 있습니까? – fuz

+0

조립 중. 나는 Manjaro 64 비트에 있지만, 32 비트 프로그램이되기를 바란다. (그러므로 나는'-m32'로 컴파일한다.) – Frynio

답변

0

당신은 MOV 명령어를 사용하여, FST 명령어를 사용하여 메모리에 FPU 레지스트리의 값을 복사 (C 지역 변수) CPU 레지스터에로드 할 수 명심

(당신은 x86 아키텍처에서있어 가정) FPU 그 레지스터는 80 비트를 갖는다.

1

printf를 사용하여 바이너리를 출력 할 방법이 없습니다. 그렇게해야한다면 자신 만의 함수를 작성해야합니다. 이것은 이미 SO에서 다루었습니다. here.

당신은 부동의 구성 요소 (IEEE 754 단 정밀도), 당신은 약간의이 같은 조합을 사용하여 분해하려면 :

union float_bits 
{ 
    float f; 
    struct bits 
    { 
     unsigned int s:1; 
     unsigned int m:23; 
     unsigned int e:8; 
    } b; 
}; 

그런 다음 F로 플로트를로드 할 읽기를 bs/bm/be의 sign/mantissa/exponent

관련 문제