2012-04-18 73 views
1

我有一個用ARM彙編器編寫的簡單函數。第一次運行時,一切都按需要運行(打印BOOT\n)。但是,第二次執行該功能時,不會打印任何內容。ARM彙編函數有問題嗎?

.globl __printTest 
.text 
.align 2 

__printTest: 
sub sp, #64 /* yes, I know this is too much */ 

mov r0, #66 
str r0, [sp] 
mov r0, #79 
str r0, [sp, #1] 
mov r0, #79 
str r0, [sp, #2] 
mov r0, #84 
str r0, [sp, #3] 
mov r0, #10 
str r0, [sp, #4] 

mov r0, #0 
mov r1, sp 
mov r2, #5 

bl _write 
add sp, #64 

bx lr 

可能是什麼問題?我懷疑,這不知何故擰了緩衝區,它不再工作。寫是一個函數,它使用svc指令在Linux上調用write系統調用。

回答

4

問題是你沒有保存lr

 bl _write 
    add sp, #64 
    bx lr 

bl _write將覆蓋lr然後指向add sp, #64,所以你bx lr只會導致在最後兩個指令的死循環。

__printTest: 
push {lr} 
sub sp, #64 /* yes, I know this is too much */ 
.... 
bl _write 
add sp, #64 
pop {pc} 

正如已經在另一個回答說,你也應該使用STRB,而不是STR對於字節商店:

如果您修改代碼,這樣它應該工作。

+0

謝謝!這工作。 – 2012-04-18 18:30:29

3

該函數將32位值推入未對齊的堆棧指針地址。它應該使用strb來寫單個字節。對於未對齊str,ARM體系結構參考手冊說:

if UnalignedSupport() || address<1:0> == ‘00’ then 
    MemU[address,4] = R[t]; 
else // Can only occur before ARMv7 
    MemU[address,4] = bits(32) UNKNOWN; 

所以根據您的配置,您可能會在堆棧會越來越垃圾,如果你打的未知情況。

+0

用strb替換'str's。仍然是同樣的問題。 – 2012-04-18 18:23:39