C# < - >ARM 음..?CMP?

홈 > 커뮤니티 > 질문 게시판
질문 게시판

C# < - >ARM 음..?CMP?

S 코드몽키 7 4148

오늘 유니티로 

 아래와 같은 코드를 짜 Mono 와 IL2CPP 빌드 두가지방식으로 빌드를 했습니다 

 


코드내용: Num이라는 변수에 0부터 9까지 랜덤하게 숫자를 뽑아서 담아라

만약 

Num이 3이 나왔을시 result1 이라는 매소드를 호출,

Num이 3이 아니라면 result2를 호출.




여기서 궁금한게 if else가 CMP , BNE 로 어떻게 변환되어 동작하며, 해당부분의 코드가 어떻게 구현되는지 확인하고싶었습니다

그래서 동일한 코드를 il2cpp 빌드로변경. 덤프를 통해 아래와같이 해당 매소드의 ARM코드를 뽑아봤으나.. 

보면 볼수록 더 아리송해지기만 하더군요.



지나가던 은거기인이 해당 코드를 명쾌하게 해석해주실분 계실까 해서 올려봅니다.

린님! 외계인 고만괴롭히고 도와주세요~



[이 게시물은 LIN님에 의해 2020-03-04 18:44:39 안드로이드에서 이동 됨]
7 Comments
M LIN 2020.03.04 18:44  
CMP R0, #3      // R0(리턴값)과 3을 비교
BNE  #694884    // 서로 같지 않을 경우 0x694884로 점프
  스택 복구 후 result1 호출
0x694884
  스택 복구 후 result2 호출
S 코드몽키 2020.03.05 08:53  
명쾌한 답변 감사합니다^^

이해가 안가는 부분이
CMP R0, #3

여기서 R0 은  위에서 R0,#0 이 들어가있는 상태인데 3이랑 비교하면 무조건 0x694884로 점프로 가야하는게 아닌가요?
해석을 어떤 순서로 해야하는것인지..
15 g00dluck 2020.03.05 10:07  
Random.Range의 인자로 R0(#0), R1(#0xA)가 사용되었으며
Random.Range의 리턴값이 R0이 저장되어
CMP R0, #3 <----- 이 시점에서는 R0는 Randdom.Range에 의한 결과값과 비교를 하게되는 것이죠

R0가  레지스터가 인자 전달할때도 사용되고 함수 리턴값 저장에도 사용된다는 점을 기억하시면되겠네요
S 코드몽키 2020.03.05 12:38  
감사합니다 R0이 랜덤값이 들어가 그걸로 비교한다,... 혹시나 했는데 예상했던대로네요 .. 그럼 해당 코드에서 R2는 무슨역할을 하게된건가요? 0이 들어간 이후에 사용이되지않은거같은데,.,
15 g00dluck 2020.03.06 11:26  
저도 혼동되는 부분이 있긴한데, Random.Range 값을 1,10으로 바꿔보시면 각 레지스터가 어떻게 사용되었는지 구별이 쉬울거 같아요.
8 곤마쿠니 2020.03.05 09:04  
감사합니다!
12 모야모야 2020.03.05 16:52  
어셈 너무어렵네요 다들 무슨얘기하는지 이해가안되요