2017-05-19 2 views
0

Atmel Studio에서 ATmega328P로 작업 중이며 함수/알고리즘을 만들어야합니다.이 함수는 8 비트 숫자를 사용하고 그 제곱근을 계산합니다. 결과는 두 부분으로 나누어 져야합니다. 하나는 정수 부분을위한 것이고 다른 하나는 소수 부분을위한 것입니다.Atmel 스튜디오 어셈블리 : 8 비트 숫자의 제곱근

나는 이것을 생각하고 있었다. 루트는 주어진 숫자와 0 (또는 1) 사이의 어딘가에 있어야한다. 그래서 나는 lsr (2로 나누기)를하고 더 크거나 작거나 같은지 확인한 다음 더 정밀하게 다시 시도해 보겠습니다. 그러면 더 정확해질 것입니다.

문제는 정수가 정확하지 않고 어셈블리에 익숙하지 않기 때문에 코드에 넣는 방법을 모르겠다는 것입니다. 나는 또한 내가 지금까지 만든 것을 게시 할 수있다.

조언과 도움에 감사드립니다.

+3

길이가 256 바이트 인 테이블을 검색하면 어떻습니까? (음, 소수점 부분이 512B보다 길기 때문에 ... 고정 소수점 수학 8시 8 분입니까?) 그리고 십진수는 256B 만 있으면 전체 루프를 한 루프 씩 천천히 정렬 할 수 있습니다.) – Ped7g

+0

슬프게도 그것은 할당이고 그것을 계산해야합니다. 그렇지 않으면 실행 가능한 옵션이되지만 입력에 대한 감사드립니다. –

+0

비록 내가 이것을 이해하지 못한다면 나는 이것을 최후의 수단으로 할 것이다. (삽입 된 숫자를 256 개의 결과와 비교하고 올바르게 찾으면 끝내는 프로그램을 만드는 것이 좋습니다) –

답변

0

완전성 (또는 쓸모없는 쇼)을 위해서, 여기에 곱셈없이 선형 검색 (0-15 값의 경우 대부분의 경우에 더 빠르다. 곱셈과 함께 이진 검색). 당신이 소수 부분을 필요로하지 않는다면

root = -1 
square = 0 
addValue = 1 
while (square <= input) { 
    square += addValue 
    addValue += 2 
    ++root 
} 
; here root == trunc(sqrt(input)) 

그래서,이 충분하거나 것입니다 당신이 이와 함께, 소수점 이하 부분에 대해 최소한 256B 긴 LUT를 사용하도록 허용 할 경우.

8 비트 정수 레지스터를 사용하여 적절한 소수점 sqrt를 작성하는 것은 실제로 상당히 효과적이므로 나는 모든 재미를 없앨 수 없습니다. : P ..

몇 가지 "base_exp"값을 곱하면 제한된 범위의 소수를 정수로 변환 할 수 있다는 것을 잊지 마십시오.

e.e. 0.00에서 15.99까지의 값은 * 100 (0-1599)을 수행하여 11 비트 정수로 변환 할 수 있고 (100 * 100)의 sqrt는 100이므로 10000 입력으로 0-2550000 값을 얻을 수 있습니다 (적어도 22 비트, 24b까지 반올림), 정수 제곱근을 사용하면 결과 * 100 (및 11 비트에 맞음)이되므로 100으로 나눠 두 값으로 나눌 수 있습니다.

인간에 대해서는 단순 해 보일 수 있지만 실제로 8/16b 레지스터를 사용하여 십진법 계산을 수행하는 경우이 원리로 수행되는 경우가 많았지 만 대신 2의 제곱 값, 즉 * 256 * 256이 사용되었는데 값 16 조금 남았습니다. 그리고 256으로 나눈 값은 8에서 오른쪽으로 값을 이동시킵니다.

따라서 이진수가있는이 숫자 방식의 경우 24 비트 덧셈/뺄셈/시프터 코드를 만들어야합니다. 입력 된 숫자는 24 비트의 최상위 8 비트입니다. (즉, 입력 값 10 =>(10<<16) == 0x0A0000) => 간단한 이동. 그 값을 sqrt (0x0329 또는 0x032A, 그냥 잘라내거나 마지막 비트에서 반올림하는 경우에 따라 다름)을 계산하면 결과는 반드시 12 비트에 맞을 것이고 위쪽 4는 전체 파트 0-15이고, 하위 8 비트는 "1/256"의 값 (0x29/256 = 0.16015625)으로 십진수입니다. 이는 단순한 이동/회전, 즉 mul/div 조작이 필요하지 않음으로써 다시 분할 될 수 있습니다.

그래도 여전히 많은 작업이 될 것입니다.하지만 8 비트 CPU에서 24 비트 곱하기/나누기를 수행하는 것은 추가/하위/쉬프트 확장보다 훨씬 쉽습니다. 결과의 소수 부분에서 전체 8 비트의 정밀도를 사용하고 더 많은 이진 계산을 위해 더 단순하게 만드는 이유를 4 : 8 fixed-point 결과 형식으로 선택한 이유를 설명하십시오. (8시 8 분 고정 소수점 0.5 = 0x0080 ... 그걸 추가하려고하면 어떤 일이 일어나는가 봅니다 : 0x0080 + 0x0080 = 0x0100 = 1.0 어떤 결과도 복잡하지 않습니다. 그것이 8 비트 CPU에서 저 정밀도 십진수 계산을 한 방법입니다 , 예를 들어 sin/cos 효과의 경우에도 곱셈/나눗셈이 0 일 때 더 간단합니다.5 : 0x0080 * 0x0080 = (0x4000 >> 8) = 0x0040 = 0.25).

관련 문제