2011-03-21 2 views
2

16 비트 시퀀스가 ​​주어지면이 비트를 재귀 적으로 역전시키고 싶습니다. 1,001 1,110 0,010 0,110 예
는 0110 0100 0111 1001어셈블리 언어에서 비트를 반복적으로 역전합니다.

I에만 추가하는 액세스되고, 및 NOT.
서브 루틴은 2 개의 매개 변수, 반전 될 남은 비트 수 및 비트 값을 허용합니다. 결과를 리턴합니다.

나는 이것을하는 방법을 생각하고있다. 내 머리 속에 갑자기 튀어 나온 한가지는 0000 0000 0000 0001의 비트가 연속적으로 시작되고 처리 할 비트의 수를 -1로 남긴 다음이 비트를 전달 된 비트 패턴으로 지정하는 것입니다. 문제는 이것이 매우 불충분 한 것 같아요. 또한 비트를 뒤집기 위해 결과를 저장하는 방법을 모르겠습니다.

어떤 힌트가 있습니까? 그것은 숙제이므로 힌트를 주시기 바랍니다 :)

+0

일부 점프도 사용할 수 있다고 가정합니다. MOV 및 CMP 및 TEST는 어떻게됩니까? – user470379

+0

예. 점프, 가지, 그런 종류의 일. 나는 그것들을 가지고 있지 않다. 그러나 ADD, AND 또는 NOT을 사용하면 3 개의 조건 코드가 설정됩니다. 음수, 0 및 양수입니다. 나는 그것들을 사용하여 내가 어디로 갈 것인지를 결정할 수 있습니다. 나는 MOV CMP 나 TEST가 없다. – CPlayer

답변

5

이미 ADD를 사용하여 왼쪽으로 이동 (값 추가) 할 수 있다고 생각했습니다. 따라서 반복적으로 쉬프트 한 다음 1 비트가 상수로 설정되면 비트가 가장 높은 비트에서 가장 낮은 비트로 추출됩니다. 당신은 AND와 NOT 중 하나를 (DeMorgan의 법칙을 통해) 만들 수 있습니다. 따라서 상수 1로 시작하는 단일 비트를 함께 사용하여 그 비트를 가장 낮은 값에서 가장 높은 값으로 재결합 할 수 있습니다. 역전 된 비트 열.

재귀 적 프로세스로 전환하는 것은 매우 간단합니다.

관련 문제