2012-11-28 6 views
0

이것이 반환 함수가 포함 된 코드의 끝입니다.어셈블러 ARM 부울 메서드가 항상 TRUE를 반환하도록합니다.

MOVW   R1, #0x7368 
ADD    R0, PC ; 
MOVT.W   R1, #0xF 
ADD    R1, PC ; 
LDR    R0, [R0] ; 
LDR    R1, [R1] ; 
LDR    R0, [R4,R0] 
BLX    _objc_msgSend 
MOVW   R1, #0x7DC4 
MOV    R2, R8 
MOVT.W   R1, #0xF 
MOV    R3, R6 
ADD    R1, PC ; 
LDR    R1, [R1] ; " 
BLX    _objc_msgSend 
LDR.W   R8, [SP+0x10+var_10],#4 
POP    {R4-R7,PC} 

누군가가 할 어떻게 내가 항상 TRUE를 반환 할 수있는 POP 생각 리턴 명령을 강제로 나를 설명 할 것을 언급 할 수!

내가 게시하는 코드 일부는 ... 어떤 연산을 수행하고 TRUE 또는 FALSE를 반환하는 부울 함수입니다.

감사

+0

iOS 용으로 컴파일 된 Objective C 코드 조각처럼 보입니다. 소스 코드를 수정하지 않는 이유는 무엇입니까? –

+0

네 그렇습니다! 함수가 내 것이고 내 프로젝트 중 하나이기 때문에 내가 원하는 것을 할 수 있습니다 ... 질문은 호기심을위한 것입니다 ... 이미 그 메서드를 가로 채고 반환 값을 바꿀 수있는 비틀기를 만듭니다. 사실! 이제 실행 파일에 패치를 적용하여 동일한 작업을 수행 할 수있는 방법을 알고 싶습니다 ... 도와 주실 수 있습니까? –

+0

Xcode 디버거에서 함수를 단계별로 실행하면 함수의 return 문으로 이동 한 다음 해당 ARM 어셈블리를 볼 수 있습니다. 또는 gdb/lldb 중에서 선호하는 방식으로이 작업을 수행 할 수 있습니다. 또한 위 질문에 함수에 대한 Objective C 소스 코드를 게시하십시오. 그러면 누군가가이 문제에 대한 추가 도움을 줄 수 있습니다. 귀하의 답변에 –

답변

2

를 컴파일러가 ARM 아키텍처 용 프로 시저 호출 표준을 따르는 경우는 반환 값은 R0에 전달됩니다. POP 명령은 다른 레지스터를 복원하고 PC을로드하여 호출 함수로 돌아가지만 R0을로드하지 않습니다. 함수가 항상 부울 true를 반환하도록하려면 을로드하는 POP 전에 명령어를 추가해야합니다.

+0

감사합니다! R0 레지스터를로드하는 코드를 추가하여 대답을 완료 할 수 있습니까? –

+0

POP 명령 바로 앞에 "MOV R0, # 1"행을 추가하십시오. – BitBank

+0

감사! 하지만 제 경우에는 왜 돌려 보내질 값이 R0에 있지 않습니까? –

관련 문제