2010-05-24 5 views
0

나는 C 유사 의사 코드로 두 가지 간단한 명령어를 기술하는 가장 좋은 방법과 가장 짧은 방법을 피하려고 노력하고있다. 다음과 같이 추출 명령이 정의된다 :명령어 설명을위한 의사 코드

extract rd, rs, imm 

이 명령어는 32 비트 소스 레지스터 RS로부터 적절한 바이트를 추출하고 바로 목적지 레지스터를 정당화. 바이트는 imm에 의해 지정되므로 은 0 (최하위 바이트에 대해)과 3 (최상위 바이트에 대해) 값을 취할 수 있습니다.

rd = 0x0; // zero-extend result, ie to make sure bits 31 to 8 are set to zero in the result 
rd = (rs && (0xff << imm)) >> imm; // this extracts the approriate byte and stores it in rd 

삽입 명령

는 역 동작으로 간주하고는 목적지 레지스터 RD의 적절한 바이트에 소스 레지스터 RS 석출물을으로부터 오른쪽 정렬 바이트가 소요 될 수) 다시,이 바이트가 IMM의 값에 의해 결정됩니다

tmp = 0x0 XOR (rs << imm)) // shift the byte to the appropriate byte determined by imm 
rd = (rd && (0x00 << imm)) // set appropriate byte to zero in rd 
rd = rd XOR tmp   // XOR the byte into the destination register 

이 모든 조금 무서운 보이는, 그래서 나는 에 더 우아한 방법은 C 같은 스타일이 bahaviour을 설명 조금이 궁금해

많은 감사, 클로스

+2

죄송합니다 ... RS 가장 중요한 바이트가 고려되지 않습니다 있는지 확인하는 0xFF로와 RD 마스크 오른쪽도하지만, "C와 같은 의사 코드"는 모순 어법이다. 의사 코드의 모든 이유는 공식 구문 대신 연산을 설명하기 위해 산문 및/또는 수학 표기법을 사용하여 컴퓨터에서 추상화하는 것입니다. –

답변

5

추출 :

rd = (rs >> (imm * 8)) & 0xff 

삽입 :

rd = (rd & ~(0xff << (imm * 8))) | ((rs & 0xff) << (imm * 8)) 
+0

감사합니다. 왜 인생을 더 열심히 만드는지 모르겠습니다. P – Claus

+0

삽입 라인의 첫 번째'rs '는'rd'이어야한다고 생각합니다. –

+0

감사합니다. @ 마이크. –

0

첫째, 대신 '& &'(논리 AND)의 '&'(비트 연산자 AND)를 의미한다고 생각합니다.

rd = (rs >> (imm * 8)) & 0xFF; 

두 번째 부분 :

rd = (~(0xFF << (imm * 8)) & rd) | ((rs & 0xFF) << (imm * 8)); 

첫 부분 C의 XOR의 비트 연산자는 그와 같은 일을하는 단순 '^'

rd = 0x0; 
rd = (rs & (0xff << imm)) >> imm; 

tmp = 0x0^(rs << imm)); 
rd = (rd & (0x00 << imm)); 
rd = rd^tmp; 

불허 '1'비트가있는 마스크를 만들면 재미있는 바이트가 AND (&)이 바이트를 '0'으로 설정 한 다음 rs 바이트를 추가합니다. 최적화되지 않았지만 그 점을 알 수 있습니다.

편집 : 나는 다만 매튜 대답을 본다. 나는 잘못 읽었습니다. imm는 바이트가 아닌 바이트로되어 있으므로 * 8이 필요하다는 것을 지적했습니다. 수식을 수정했습니다. 그는

my2c