2012-11-28 76 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} 

有人可以評論它做什麼,並解釋我如何強制返回指令,我認爲這是POP總是返回TRUE!

我發佈的代碼部分是一個布爾函數,它可以進行某些操作並返回TRUE或FALSE。

感謝

+0

這看起來像是iOS的已編譯目標C代碼塊 - 爲什麼不只是修改源代碼呢? –

+0

是的!我可以做我想做的事,因爲這個函數是我的,它在我的一個項目中...如果我問這個問題只是爲了好奇...我已經創建了一個可以攔截該方法並替換返回值的調整與真實!現在我想了解如何通過修補可執行文件來做同樣的事情...你能幫助我嗎? –

+0

如果您逐步完成Xcode調試器中的函數,則可以進入函數中的return語句,然後查看相應的ARM程序集。或者你可以做到這一點將gdb/lldb,無論你喜歡。還要在上面的問題中發佈函數的Objective C源代碼,也許有人可以爲此提供進一步的幫助。 –

回答

2

如果編譯器遵循ARM體系結構的過程調用標準則返回值R0傳遞。指令POP恢復其他寄存器並加載PC返回到調用函數,但不加載R0。如果你想要函數總是返回一個布爾真,那麼你需要在加載R0POP之前添加一條指令。

+0

感謝您的回答!你可以通過添加代碼來加載R0寄存器來完成你的答案嗎? –

+0

在POP指令之前加上一行「MOV R0,#1」。 – BitBank

+0

謝謝!但在我的情況下,爲什麼不會返回的值不在R0中? –