문제

ARM 어셈블리에서 즉시 즉시는 8 비트 회전 값으로 인코딩되므로 인코딩 할 수 있습니다.

(0-256)^2n.

이제 내 문제는 R0의 상위 16 비트를 지우고 반 단어 저장 R1로 교체하고 싶다는 것입니다. 그러나 즉각적인 범위의 제한된 범위 때문에 다음을 수행해야합니다.

bic r0, r0, #0xff000000
bic r0, r0, #0x00ff0000
add r0, r0, r1, LSL #16

2 BIC 지침을 단일 명령으로 바꿀 수 있습니까? 0xFFFF0000은 인코딩 할 수 없습니다. 어쩌면 나는 상단 16 비트를 지우기 위해 다른 논리적 작업을 사용해야합니까?

감사

편집 : R1의 상위 16 비트가 비어 있고 ARM7TDMI를 사용하고 있다고 말하는 것을 잊어 버려 죄송합니다.

도움이 되었습니까?

해결책

어때요 :

orr r0,r1,r0,lsl #16
mov r0,r0,ror #16

(이것은 참조 코드와 같이 R1의 상단 절반이 비어 있다고 가정합니다.) 상황에 따라 나중에 일부 코드를 병합하여 여기에서 최종 이동을 생략 할 수 있습니다.

다른 팁

새로운 팔 코어가 있으면 질문이 간단합니다.

movt    r0, #0
orr     r0, r0, r1,lsl#16

보다 http://www.keil.com/support/man/docs/armasm/armasm_cjagdjbf.htm

그러나 ARMV6+가있는 경우 실제로 한 번에 인용 된 전체 예제를 수행 할 수 있습니다.

pkhbt   r0, r0, r1,lsl#16

보다 http://www.keil.com/support/man/docs/armasm/armasm_cihjedjg.htm

"반 단어가 저장된 R1로 교체하십시오" - 이것은 R1의 상위 16 비트가 0이라고 가정 할 수 있습니까? 그렇다면,

add r0, r1, r0 lsl #16
mov r0, r0 ror #16

Mov를 자리 표시 자로 생각하십시오. ROR을 다음에 입력하여 R0을 입력하고 실제로 같은 주기로 유용한 작업을 수행 할 수 있기를 바랍니다.

ARMV6 (예 : MPCORE)에서

    uxth    r1, r1
    orr     r0, r1, r0, asl #16

모든 것을 지울 수 있다면 xor 그 자체로.

하부 절반을 유지 해야하는 경우 레지스터 8 비트와 뒤로 왼쪽으로 이동할 수 있습니까? 그러나 그것은 같은 수의 지침 일 수 있습니다.

C 코드의 경우

 (a<<16)|((short)b)

GCC가 생성됩니다

    mov     r1, r1, asl #16
    mov     r1, r1, asr #16
    orr     r0, r1, r0, asl #16

그러나 즉각적인 것을 사용하지 않습니다. 그러나 여전히 두 가지 지침입니다.

BFC 명령어를 사용할 수 있습니다. 비트 필드 클리어. 이 명령어는 M 비트에서 N 비트를 지 웁니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top