2016-10-03 1 views
1

ARM 프로그래밍 내에서 조건부 실행을 파악하려고합니다. 것ARM 구문의 "And"에 대한 조건부 실행

if ((R0 != 5) || (R2 != R3)) ; != means not equal, || mean OR 
{ 
R4-- ; // R4 = R4 - 1 
} 

그리고 이것의 ARM 버전 :

그래서 나는 종류의 이런 상황을 이해

CMP R0, 5 
CMPEQ R2, R3 
SUBNE R4, R4, 1 

내가 궁금해서 ARM 그는 "OR"는 것을 아는 방법 (||). 그래서 두 가지를 비교합니다. 그러나 두 비교가 맞지 않으면 어떻게됩니까? 그것은 NE가하는 일입니까? 다른 경우 (예 : 아래 예와 같이) 어떻게됩니까?

if ((R0 > 5) && (R2 != R3)) ; != means not equal, && mean AND 
{ 
R4-- ; // R4 = R4 - 1 
} 

는 어떻게 ARM 조건부 지침이 작성합니다 :

그래서 코드는이라고 할 수 있습니다?

감사합니다.

+0

이하인 경우 분기를 나타냅니다. 당신은 단지 두 조건을 반전하고, 두 조건 중 어느 것이 주어질 때'R4 -'를 건너 뛰게됩니다 (당신이 ||와 같이 할 때) – Tommylee2k

+0

@ Tommylee2k invert가 무엇을 의미합니까? 예를 들어 줄 수 있습니까? – hiquetj

+0

ARM은 asm이 수행해야하는 작업을 "알지 못합니다."그냥 지시 사항을 실행합니다. 중요한 것은 가능한 모든 입력에 대해 결과가 C와 동일하다는 것입니다. 예를 들어, asm에서 구현할 때, C가 단락을 일으키는 것을 평가하는 것을 피할 필요가 없습니다. (예를 들어, 값이 이미 레지스터에 있다면, 처음에'&&'의 절반을 검사 할 수 있습니다. 그러나 후자가 포인터를 역 참조하는 경우 NULL이 될 수 있으므로 C가 없을 때 역 참조하는 asm을 작성하면 안됩니다 't.) –

답변

3

'OR'의 경우 직관적 인 것처럼 보이는 간단한 논리입니다. 내 의견으로는 'AND'가 더 간단합니다. 핵심은 두 번째 조건은 'AND'로 처음 전달 된 경우에만 평가되어야한다는 것입니다. 'OR'의 경우 반대입니다. 논리를 단락시키고 두 번째 조건을 실행하는 것을 귀찮게하지 마십시오. 여기


는 CC2

이 'CC1 경우 실행 CC1 테스트 CC2

  • 경우
  • ==

    1. 테스트 CC1의'AND '경우의 단계는 cc2 '이고 첫 번째가 false이면 2 단계는 실행되지 않으므로 3도 수행되지 않습니다.


      그것은으로 번역 할 것

      TST R2, R3  ; step 1 as (R2 != R3) 
      MSREQ CPSR_f,#3<<30 ; set N and Z flags (also APSR_nz) 
      CMPNE R0, #5  ; step 2 as (R0 > 5) 
      SUBPL R4, #1  ; step 3 
      

      케어 1 단계에서 첫 번째 테스트의 실행에 영향을주지 않도록주의해야합니다, 당신의 예를 촬영하려면 3 단계. 테스트는 반드시 테스트되어야하므로 'AND'조건에 맞게 테스트 순서를 변경할 수 있습니다. 이 도움이 필요할 수 있습니다 그들을 위해 HeyRick on status register

  • +0

    도움이되었지만 ARM 명령어에서 # 2를 수행하는 방법은 무엇입니까? while 조건부 명령어를 사용하는 중 – hiquetj

    +0

    예제를 보여줄 편집을 추가했습니다. 상태 코드를 MSR로 리셋하거나 분기를 사용해야 할 경우가있는 'AND'사례/조건이 있습니다. –

    +0

    'R2'와 'R3'이 양수이면 어떻게 될까요? 'CMP'는'T'에 의해'Z' 플래그가 설정 되었기 때문에 실행되지 않습니다. 그러나 'N'플래그는 'TST'에 의해 지워 지므로 'SUB'는 실행되지 않아도 실행됩니다. – Michael

    1


    Dave space on conditional execution
    그래서 나는 내 문제에 대한 해결책을 찾을 수 있다고 생각 .. :

    참조하십시오. 나는 교수님을 운 좋게 도와 줬다.

    그래서 코드라고 할 수 있습니다 :

    if ((R0 > 5) && (R2 != R3)) ; != means not equal, && mean AND 
    { 
    R4-- ; // R4 = R4 - 1 
    } 
    

    ARM 조건부 솔루션이 될 수 :

    CMP R0, #5 
    BLE Somewhere 
    CMP R2, R3 
    SUBNE R4, #1 
    Somewhere: 
    

    어딘가에 떨어져 분기하는이 다음 비교 때문에에 "& &"년 이후 실패했다면 if 문을 계속 사용하지 않으려 고합니다.

    BLE은 분기가없는 경우

    +0

    브랜치 도입을 시작하면 (필요없는 경우) 조건부 실행을 실제로 활용하지 못합니다. 브랜치가 파이프 라인 마비로 이어질 수 있기 때문입니다. 조건부 실행의 주된 이점 중 하나는 종종 다른 CPU 아키텍처 (조건부 실행이없는)에서 분기를 재사용하는 코드의 분기없는 변형을 구현할 수 있다는 것입니다. – Michael

    +0

    @ 마이클 오, 그건 의미가 있습니다! 난 단지 MSR을 사용하기 전에 설정되는 조건부 플래그를 확인하지 않았다. – hiquetj