2017-01-09 1 views
0

중괄호의 사용 :ARM 어셈블리 내 ARMv5 어셈블리에이 같은 지침을 발견

pop  {r2} ; (str r2, [sp, #-4]!) 
push {r0} ; (str r0, [sp, #-4]!) 
push {r4, r5, r6, r7, r8, r9, sl, lr} 

본인은 푸시와 팝있는 여러 레지스터에이 지침 저장 및로드 STRLDR 및 그 약어 그러므로이 중괄호는이 경우에 "레지스터가 저장되거나로드되도록 설정되어 있음"을 의미한다고 생각합니다.

제 가정은 정확합니까?

+0

소리가 좋아. – fuz

+0

참조 설명서를 읽지 마십시오. – Jester

+0

S.O.를 사용하지 마십시오. 어느 한 쪽? –

답변

2

그래, 그냥 설명서를 읽어보십시오. 어셈블러는 단일 레지스터 푸시 및 팝에 대해 str/ldr 또는 stm/ldm을 사용하도록 선택할 수 있습니다. 요즘에는 스택을 64 비트 경계에 정렬하여 유지하기 때문에 일반적으로 짝수 개의 레지스터가 푸시되거나 팝되지만 필요한 경우 한 번에 하나씩 수행 할 수 있습니다. 엄지 푸시/팝의 경우 자체로드 또는 저장 코드가 아닌 지침이 있습니다.

00000000 <.text>: 
    0: e49d2004 pop {r2}  ; (ldr r2, [sp], #4) 
    4: e52d0004 push {r0}  ; (str r0, [sp, #-4]!) 
    8: e92d40f0 push {r4, r5, r6, r7, lr} 

00000000 <.text>: 
    0: bc04  pop {r2} 
    2: b401  push {r0} 
    4: b5f0  push {r4, r5, r6, r7, lr} 

이 경우 ARM 인코딩이로드/저장뿐만 아니라 디스어셈블러 코멘트로 나타 납니까 (x4xxxxxx) LDM은/STM은 마지막 같은 x8xxxxxx 인코딩입니다.

이 모든 것은 물론이 질문에 대한 대답 인 ARM 문서 또는 기타 궁금한 사항이있을 수 있습니다. 모든 대답을 알아낼 수 있다면 물론 stackoverflow 쓸모가 될 수 있습니다. 그러나이 경우 구문을 보여주는 일부 참조를 검토 중이며 동일한 참조는 레지스터 목록이 집합임을 나타내는 추가 텍스트가 있어야합니다. 인코딩에는 각각 15 비트 또는 9 비트가 있으며 몇 가지 간단한 예제를 통해 구문에서 지정한 목록과 인코딩이 일치하는지 확인할 수 있습니다.

예 중괄호는 모두를 밀어 넣거나 모든 경우를 팝하는 것을 의미합니다. 문서는 설정과 예를

또한

원래이 참고

push {r4,r2,r3} 

에서

push {r2,r3,r4} 

다른 어떤 레지스터가 어떤 순서로 메모리에 넣어뿐만 이후 증가하기 전에 감소를 커버 푸시/팝 지시가 아니었고, 그들은 ldm/stm이 아닌 실제 푸시/팝 엄지 지시와 함께왔다. (왜냐하면 그들은 r13이 16 비트에서 4 비트를 지정하기에 충분할 비트를 가지고 있지 않기 때문에 ldm/stm이있다. r0-r7로 제한됨). 마찬가지로 세 가지 레지스터 연산에 대해 세 개의 레지스터를 모두 지정해야만 나중에 어셈블러에서 arm 명령어에 thumb 구문을 사용할 수있게하고 결과적으로 복잡하지 않게 통일 구문을 사용할 수 있습니다.

어셈블리 언어가 일반적으로 표준화되지 않았 음을 가장 중요하게 기억하십시오. 텍스트를 읽는 프로그램을 사용하는 그들은 오직 특정 어셈블러에 의해 정의되고, 사람이 쉽게 어셈블러에 대한 법률 구문으로이

push (r1,r2) 
pop [r3,r4] 
push r2,r3,r4,r5 
str r3,r2 

을 허용 할 수 있습니다. 동일한 명령어 세트에 대한 암 도구와 gnu 도구의 차이점을 살펴보십시오. 전통적인 pdp-11 구문에 비해 pdp-11 gnu 어셈블러 구문을 훨씬 더 재미있게 볼 수 있습니다. (예, 유지 보수 된 pdp-11 백엔드가 있습니다.)

그래서 우리가 당신이 무엇을 요구하는지 거의 알았음에도 불구하고 당신이 사용하고있는 어셈블러에 관해서는 더 구체적으로 질문해야합니다.

+0

나는 간단한 "예 또는 아니오"종류의 대답을 기대하고있었습니다. 하지만 너는 그걸 넘어서서 오늘 많은 것을 배웠고 어셈블러 언어가 표준이 아니란 것을 몰랐다. 고마워. –