7954|11

77

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于ARM C语言的问题 [复制链接]

大家好:

    下面的这段代码是在ADS下面编译的

       Uart_Printf("\nNow, Downloading [ADDRESS:%xh,TOTAL:%d]\n");
   
    串口输出显示:Now, Downloading [ADDRESS:190h,TOTAL:400]

    如果改成:      

       Uart_Printf("\nNow, Downloading [%xh,%d]\n");

    串口输出显示:
         
       Now, Downloading [190h,400]

请问大家里面的190h和400是怎么来的?
请高数指教。


void Uart_Printf(char *fmt,...)
{
    va_list ap;
    char string[256];

    va_start(ap,fmt);
    vsprintf(string,fmt,ap);
    Uart_SendString(string);
    va_end(ap);
}

void Uart_SendString(char *pt)
{
    while(*pt)
        Uart_SendByte(*pt++);
}


void Uart_SendByte(int data)     //若:void  则:Error :type disagreement for 'Uart_SendByte'
{
    if(whichUart==0)
    {
        if(data=='\n')
        {
            while(!(rUTRSTAT0 & 0x2));
            Delay(10);                 //because the slow response of hyper_terminal
            WrUTXH0('\r');
        }
        while(!(rUTRSTAT0 & 0x2));   //Wait until THR is empty.
        Delay(10);
        WrUTXH0(data);
    }
    else if(whichUart==1)
    {
        if(data=='\n')
        {
            while(!(rUTRSTAT1 & 0x2));
            Delay(10);                 //because the slow response of hyper_terminal
            rUTXH1 = '\r';
        }
        while(!(rUTRSTAT1 & 0x2));   //Wait until THR is empty.
        Delay(10);
        rUTXH1 = data;
    }   
    else if(whichUart==2)
    {
        if(data=='\n')
        {
            while(!(rUTRSTAT2 & 0x2));
            Delay(10);                 //because the slow response of hyper_terminal
            rUTXH2 = '\r';
        }
        while(!(rUTRSTAT2 & 0x2));   //Wait until THR is empty.
        Delay(10);
        rUTXH2 = data;
    }      
}     
此帖出自ARM技术论坛

最新回复

厉害啊~~~  详情 回复 发表于 2009-12-8 10:03
点赞 关注
 

回复
举报

79

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
补充:
     
     友善的Micro 2440

谢谢了!
此帖出自ARM技术论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
首先,你这么写肯定是不对的,既然有%x,%d,又不加参数,那肯定会输出未定义的值。
如果你一定要追究为什么,其实看一下汇编就知道了:
va_start(ap,fmt);
  00011024: E28D3E11 add         r3, sp, #0x11, 28 //r3=sp+0x110
  00011028: E2833004 add         r3, r3, #4        //r3=r3+4  
  0001102C: E58D3100 str         r3, [sp, #0x100]  //[sp+0x100]=r3 => ap=r3
vsprintf(string,fmt,ap);
  00011030: E59D2100 ldr         r2, [sp, #0x100]  //r2=[sp+0x100] => r2=ap
  00011034: E59D1110 ldr         r1, [sp, #0x110]  //r1=[sp+0x110] => r1=fmt
  00011038: E28D0000 add         r0, sp, #0        //r0 =sp        => r0= str  
  0001103C: EB000229 bl          vsprintf
所以vsprintf的第三个参数ap是传入的fmt+sizeof(fmt)的地址,由于fmt在栈上的位置已经固定了,而栈是从高到低的,所以fmt+sizeof(fmt)的值虽然是未定义的,实际上也是固定的值。
此帖出自ARM技术论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

4
 
Uart_Printf("\nNow, Downloading [ADDRESS:%xh,TOTAL:%d]\n");
%x   %d   后面要给值的
此帖出自ARM技术论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 2 楼 ruritanian 的回复:
首先,你这么写肯定是不对的,既然有%x,%d,又不加参数,那肯定会输出未定义的值。
如果你一定要追究为什么,其实看一下汇编就知道了:
va_start(ap,fmt);
? 00011024: E28D3E11 add? ? ? ? r3, sp, #0x11, 28 //r3=sp+0x110
? 00011028: E2833004 add? ? ? ? r3, r3, #4? ? ? ? //r3=r3+4?
? 0001102C: E58D3100 str? ? ? ? r3, [sp, #0x100]? //[sp+0x100]=r3 => ap=r3
vsprintf(string,fmt,ap);
? 00011030: E59D2100 ldr? ? ? ? r2, [sp, #0x100]? //r2=[sp+0x100] => r2=ap
? 00011034: E59D1110 ldr? ? ? ? r1, [sp, #0x110]? //r1=[sp+0x110] => r1=fmt
? 00011038: E28D0000 add? ? ? ? r0, sp, #0? ? ? ? //r0 =sp? ? ? ? => r0= str?
? 0001103C: EB000229 bl? ? ? ? ? vsprintf
所以vsprintf的第三个参数ap是传入的fmt+sizeof(fmt)的地址,由于fmt在栈上的位置已经固定了,而栈是从高到低的,所以fmt+sizeof(fmt)的值虽然是未定义的,实际上也是固定的值。


学习.......分析的嘎嘎的。
此帖出自ARM技术论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

6
 
由Uart_Printf("\nNow, Downloading [ADDRESS:%xh,TOTAL:%d]\n"); 得来的吧?
我也不太懂
此帖出自ARM技术论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 2 楼 ruritanian 的回复:
首先,你这么写肯定是不对的,既然有%x,%d,又不加参数,那肯定会输出未定义的值。
如果你一定要追究为什么,其实看一下汇编就知道了:
va_start(ap,fmt);
? 00011024: E28D3E11 add? ? ? ? r3, sp, #0x11, 28 //r3=sp+0x110
? 00011028: E2833004 add? ? ? ? r3, r3, #4? ? ? ? //r3=r3+4?
? 0001102C: E58D3100 str? ? ? ? r3, [sp, #0x100]? //[sp+0x100]=r3 => ap=r3
vsprintf(string,fmt,ap);
? 00011030: E59D2100 ldr? ? ? ? r2, [sp, #0x100]? //r2=[sp+0x100] => r2=ap
? 00011034: E59D1110 ldr? ? ? ? r1, [sp, #0x110]? //r1=[sp+0x110] => r1=fmt
? 00011038: E28D0000 add? ? ? ? r0, sp, #0? ? ? ? //r0 =sp? ? ? ? => r0= str?
? 0001103C: EB000229 bl? ? ? ? ? vsprintf
所以vsprintf的第三个参数ap是传入的fmt+sizeof(fmt)的地址,由于fmt在栈上的位置已经固定了,而栈是从高到低的,所以fmt+sizeof(fmt)的值虽然是未定义的,实际上也是固定的值。


厉害!
此帖出自ARM技术论坛
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用 2 楼 ruritanian 的回复:
首先,你这么写肯定是不对的,既然有%x,%d,又不加参数,那肯定会输出未定义的值。
如果你一定要追究为什么,其实看一下汇编就知道了:
va_start(ap,fmt);
? 00011024: E28D3E11 add? ? ? ? r3, sp, #0x11, 28 //r3=sp+0x110
? 00011028: E2833004 add? ? ? ? r3, r3, #4? ? ? ? //r3=r3+4?
? 0001102C: E58D3100 str? ? ? ? r3, [sp, #0x100]? //[sp+0x100]=r3 => ap=r3
vsprintf(string,fmt,ap);
? 00011030: E59D2100 ldr? ? ? ? r2, [sp, #0x100]? //r2=[sp+0x100] => r2=ap
? 00011034: E59D1110 ldr? ? ? ? r1, [sp, #0x110]? //r1=[sp+0x110] => r1=fmt
? 00011038: E28D0000 add? ? ? ? r0, sp, #0? ? ? ? //r0 =sp? ? ? ? => r0= str?
? 0001103C: EB000229 bl? ? ? ? ? vsprintf
所以vsprintf的第三个参数ap是传入的fmt+sizeof(fmt)的地址,由于fmt在栈上的位置已经固定了,而栈是从高到低的,所以fmt+sizeof(fmt)的值虽然是未定义的,实际上也是固定的值。

这是反汇编出来的嘛?注释那么详细,佩服!
此帖出自ARM技术论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

9
 
ding
此帖出自ARM技术论坛
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

10
 
的确很深刻啊,2楼的
此帖出自ARM技术论坛
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

11
 
好贴,顶
此帖出自ARM技术论坛
 
 
 

回复

90

帖子

0

TA的资源

一粒金砂(初级)

12
 
厉害啊~~~
此帖出自ARM技术论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表