免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2509 | 回复: 2
打印 上一主题 下一主题

printf函数不好用 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-04 13:22 |只看该作者 |倒序浏览
我在ARM汇编里,通过函数指针调用C语言的一个自定义函数,里面有一个printf(),调试发现能调用这个函数,但不能打印出想出的信息.

*.c文件

extern ServiceFunction(void);  //这个是汇编里的函数

void print_msg(){
   printf("hello,world");
}

int Main(){
   ....
   (*(volatile unsigned *)0x0800)=print_msg;   /* 不一定是0x8000,就是一个内存地址而已 */
   ....
}


asm文件:

....

      b Main

;这段代码就是取出0x8000里的函数地址,然后跳到那里去执行.
ServiceFunction
      ldr r8,=0x8000
      ldr pc,[r8]


整个程序的流程是这样,先执行汇编,然后跳到C的Main,在Main里把函数指针放到指定的内存,然后调用汇编里的一个子过程ServiceFunction,把内存里的print_msg函数地址
取出来,放到pc里,转到print_msg去执行,调试时发现函数是执行了(比如向指定内存地址赋值,就可以实现),但AXD的控制台没有打印出字符串,不知为什么,请各位帮忙看看.

[ 本帖最后由 2195113 于 2008-6-4 13:32 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-06-04 20:08 |只看该作者
我把源码粘上来,请大家给个答案.
;******************
;  init.s
;******************
service     equ 0x0c009000 ;存放C语言服务程序的内存
controlunit equ 0x0c008000 ;根据哪一个位上置1,来决定调用哪个函数,1-4位
       

        area init,code,readonly       

        import Main
        export ServiceFunction
       
        entry
zero
        b InitService
        b .
       
        ltorg
       
       
InitService
        ldr r8,=controlunit
        ldr r9,=0x0
        str r9,[r8]
       
        ;初始化堆栈
        ldr sp,=stack_base
        b  Main
        b .
       
        ltorg
       
ServiceFunction rout
        ldr r8,=controlunit
        ldr r9,        [r8]
       
        mov r7,#0x0
       
0        movs r9,r9,lsr #1
        bcs %f1
        add r7,r7,#4
        b   %b0       
1        ldr r6,=service1
        add r6,r6,r7
        ldr pc,[r6]
       
        align
       
        area mydata,data,readwrite

        ^  service-0x100
stack_base # 256       

        ^  service
service1 # 4
service2 # 4
service3 # 4
service4 # 4       
        end
               

/* service.c */
#include <stdio.h>

#define mCONTROLUNIT (*(volatile unsigned *)0x0c008000)
#define mService1    (*(volatile unsigned *)0x0c009000)
#define mService2    (*(volatile unsigned *)0x0c009004)
#define mService3    (*(volatile unsigned *)0x0c009008 )
#define mService4    (*(volatile unsigned *)0x0c00900c)

char * s1="this is No.1 string.";
char * s2="this is No.2 string.";
char * s3="this is No.3 string.";
char * s4="this is No.4 string.";               

void print_msg1(void);
void print_msg2(void);
void print_msg3(void);
void print_msg4(void);

extern ServiceFunction(void);

int Main(){
        int i=1;
       
        printf("this message if from C.\n");  //这句也不好用
       
        //设置服务函数地址
        mService1=(unsigned)print_msg1;
        mService2=(unsigned)print_msg2;
        mService3=(unsigned)print_msg3;
        mService4=(unsigned)print_msg4;
       
       
        while(1){
                if(i>8 ) i=1;
                mCONTROLUNIT=i;
                ServiceFunction();
                i *= 2;
        }
        return 0;
}

void print_msg1(){
        printf("%s\n",s1);
}

void print_msg2(){
        printf("%s\n",s2);
}

void print_msg3(){
        printf("%s\n",s3);
}

void print_msg4(){
        printf("%s\n",s4);
}

[ 本帖最后由 2195113 于 2008-6-4 20:13 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2008-06-10 18:20 |只看该作者

回复 #2 2195113 的帖子

printf();
fflush(stdout);  这样试试
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP