2011-08-08 4 views
2

재미 있고 기술을 향상시키기 위해 컴파일러를 작성하고 있습니다. C 언어의 하위 집합을 구현하고 싶습니다. 문제는 Sextium II라는 이론적 인 16 비트 RISC 프로세서 어셈블러로 컴파일하는 것입니다. 우리는 우리 대학에서 어셈블러를 가르치기 위해 사용했습니다.ADD, SUB, MUL 및 DIV 명령어로만 비트 연산을 구현하십시오.

프로세서는 16 개의 명령 만 사용하며 비트 연산은 없습니다. C 비트 연산자 - 나중에 반 정밀도 부동 소수점을 구현하고 싶습니다만, ADD, SUB, MULDIV 명령어 만 사용하여 비트 연산을 구현하는 방법을 알지 못합니다. 비트 시프트는 매우 간단합니다. 2^n으로 곱셈 또는 나눗셈을 수행합니다. 여기에서 n은 시프트 길이입니다. 그러나 AND, OR, NOT 또는 XOR은 어떨까요?

EDIT 분명히 : 프로세서는 16 비트 부호있는 U2 산술에서만 계산합니다.

+0

느려지 겠지만 x AND 1은 x MOD 2입니다. 루프를 사용하고 16 비트 AND를 구성 할 때마다 이동합니다. 1 비트 x OR y는 (x AND 1) || (y와 1) (나는 이미 이것을 구현했다고 가정하고있다.) 다시 한 번 루프가 당신에게 16 비트 버전을 줄 것이다. XOR과 유사합니다. 나는 이것이 더 똑똑한 방법으로 행해질 수 있다고 확신하지만 이것은 대체로 작용할 수있다. – user786653

답변

1

는 예를 들어 추가에 대한 비트 진리표를 보면 잘 경우 :

a b c r 
0 0 0 0 
0 1 0 1 
1 0 0 1 
1 1 1 0 

a와 b 피연산자가 r에 입력이 결과 C는이 수행입니다 수 있습니다.

비트 관점에서 추가는 xor입니다. 그러나이를 일반 xor로 사용하려면 각 비트에 하나씩 피연산자를 마스킹하고 결과 비트를 추출하는 모든 작업을 더한 16 개의 연산을 수행해야합니다.

a b c r 
0 1 0 1 
1 1 1 0 

다시 추가 할 수 있지만 b 피연산자는 항상 하나에 초점을 맞추면 기능이 없습니다. 여기서도 마스킹과 이동이 필요합니다.

물론 마스킹 및 전환 작업을 수행하지 않으셨습니까?

승수는 왼쪽으로 시프트되고, 2는 1 시프트, 4는 2 시프트 등이됩니다. 마찬가지로 분열은 교대 권리입니다. 4로 나누는 것은 2의 시프트이고, 8으로 나누는 것은 3의 시프트입니다. 이 방법으로 개별 비트를 마스크하고 8로 나누어 오른쪽으로 3 이동 한 다음 0x8000을 곱하여 왼쪽으로 15 이동 한 다음 0x1000으로 나눕니다. 그게 0x0008과 anding 같을까요?

그 다음 작동하면 0x100으로 곱한 다음 0x100으로 나누고 0xFF00과 anding이 같아 질 수 있습니다.

부호가있는 곱셈 (나눗셈) 또는 부호가 없습니까? 아니면 둘 다 가지고 있니?

+0

모든 작업은 16 비트 부호있는 U2 산술로 수행됩니다. – Archie

+0

부호 비트가 포함될 때 곱셈과 나눗셈을 사용하면 상황이 바뀔 수 있습니다. 예를 들어 0x8000 * 0x7FFF의 부호없는 곱셈은 0x3FFF8000입니다. 여기서 0x8000 * 0x7FFF의 부호있는 곱셈은 0xC0008000입니다. 16 비트 * 16 비트 = 32 비트 결과가 없기 때문에이 둘은 동일하게 보일 수 있습니다. 실제로 0x1000을 0x8000으로 나누면 0x0008은 부호가없고 0xFFF8은 서명됩니다. –

+0

감사합니다. 나는 물건을 더 빨리 만드는 몇 가지 해킹이있을 거라 생각했지만 분명히 그렇지 않다. 나는 당신의 대답을 받아 들일 것입니다. – Archie

관련 문제