2017-02-03 3 views
1

TriCore TC1797 코드를 살펴보고 일치하는 인스트럭션 세트 매뉴얼 TriCore V1.3.1 인스트럭션 세트를 참조하십시오.인피니언 TriCore TC1797 조립 지침 JGE

내 질문은 사소하지만 아직 Tasking 컴파일러에서 생성 된 어셈블리 코드가 나를 혼란스럽게합니다. 코드는 영원히 반복 될 것처럼 보이지만 코드는 작동합니다. 그게 어떻게 가능해?

다음 명령 줄 (의견 동작에 대한 이해입니다) 걸릴 수 있습니다 다음 D9은 항상 양수이기 때문에 내가 (? 오른쪽), 결코 가고 있지 않은, 이해하지 못하는 어떤

MOVH.A a12, #@HIS(VAR_ADDRESS) 
LEA a12, [a12]@LOS(VAR_ADDRESS) 
LD.H d15, [a12]0   ; d15 = 4 (half-word) passed to this function 
          ; values passed are either 0x04 or 0x10 or 0xA8 

loop_addr: 
ADD d15, d15, #-0x10  ; d15 = 4 - 0x10 = 0xFFFFFFF4 
EXTR d9, d15, #0, #16  ; d9 = 0x0000FFF4 
          ; edit: THIS IS MY MISTAKE 
          ; correct is d9 = 0xFFFFFFF4 
... 
    other code here, never touching d9 
... 
ST.H [a12], d9   ; store decremented value back 
JGE d9, #1, loop_addr ; ???? comparing 0x0000FFF4 to 1 
          ; will it loop forever? 

0일까요, 어떻게 가능합니까, 루프가 종료됩니까?

설명해 주셔서 감사합니다. 설명서에서 다시 읽었지만이 상황에 대한 설명을 찾을 수 없습니다.

+0

일반적으로 서명 된 비교와 부호없는 비교에 대한 조건부 점프가 있습니다. 'ja' 명령과 같은 것이 있습니까? – fuz

+0

서명이없는'JGE.U'가 있기 때문에'JGE'가 서명되어 있습니다. 따라서'd9'가'0x0000FFF4'까지 숨겨져 있기 때문에 서명 된 것으로 취급 될 것입니다. 따라서 부호가 있거나 비교되지 않은 비교를 사용하는지 여부는 중요하지 않습니다. – Jester

+0

fuz : 이것은 분명히 JGE (JGE.U가 아님) 명령이므로 서명 된 비교입니다 – EmbeddedGuy

답변

2
ADD d15, d15, #-0x10  ; d15 = 4 - 0x10 = 0xFFFFFFF4 
EXTR d9, d15, #0, #16  ; d9 = 0x0000FFF4 

이것은 실수입니다. EXTR 부호는 추출 된 비트 필드를 확장합니다. manual 인용 기준 : EXTR 명령은 결과의 최상위 비트를 채운다

을 사인 연장 (비트 필드 최상위 비트 중복) 추출 된 비트 필드.

따라서 d9은 실제로 0xFFFFFFF4입니다. JGE은 부호가있는 비교를 사용하므로 적절하게 -12으로 처리되고 루프가 종료됩니다.

+0

감사합니다 !!! 나는이 정답을 upvoted지만, 내 명성이 15 이상이 될 때만 나타납니다. – EmbeddedGuy