Chinaunix

标题: 请大家帮我找找代码问题 [打印本页]

作者: garyv    时间: 2011-11-09 16:24
标题: 请大家帮我找找代码问题
源码func.S:

        .section rodata
        .align 4
string:
        .ascii "info from assembly code[%d]!\n\0"

        .section text
        .global func
addr:
        .word        string
        .align 4

func:
        MOV R2, LR
        MOV R1, R0
        LDR R0, addr
        BL printf
        LDR R0, =0x0000
        MOV PC, R2

源码main.c:
#include "stdio.h"

int func(int a);

int main(int argc, char * argv[])
{
        return func(3);
}

func()功能很简单,就是将传入的int和一个预定义的字符串通过printf打印出来。
编译通过,但运行时提示: Segmentation fault,就退出了
作者: duanlin    时间: 2011-11-09 21:45
是不是 func 得显式的 return 才好。不返回就弹不回栈,就跑飞了。
作者: duanlin    时间: 2011-11-09 21:46
是不是 func 得显式的 return 才好。不返回就弹不回栈,就跑飞了。
作者: garyv    时间: 2011-11-10 09:21
本帖最后由 garyv 于 2011-11-10 09:23 编辑

回复 3# duanlin


    你说的显式返回是什么意思? MOV PC, R2不算吗?ARM的BL或BLX指令并不会影响stack,不像x86的call类指令
作者: cjaizss    时间: 2011-11-10 12:12
你把
#include "stdio.h"

int func(int a);

int main(int argc, char * argv[])
{
        return func(3);
}
的汇编码贴出来,然后想想.
作者: garyv    时间: 2011-11-10 18:43
找到问题了,R2在printf()中被修改了,保存LR应该使用stmfd sp!, {lr}




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2