[求助] ARM编程:关于IAR编译结果的问题
struct TIME {
unsigned char uu;
unsigned char nn;
};
struct AAA {
unsigned char a;
struct TIME aa;
struct TIME bb;
unsigned char buf[100];
};
……
void test(struct TIME a)
{
//sys_trace("%04x, %04x, %04x", a.uu, b.uu, b.nn);
sys_trace("%04x", sizeof(a.uu));
sys_trace("%04x", a.nn);
sys_trace("%04x", sizeof(a.uu));
//sys_trace("%d, %d, %d, %d", c.uu, c.nn, d.uu, d.nn);
}
int xxxxx(……, struct AAA *stru)
{
……
test(stru-> aa);
……
}
如上程序
在sys_trace("%04x", a.nn);这里
不管是a.uu还是a.nn都是unsigned char型才对
我用IAR 4.30A编译后的结果却是
1051 void test(struct AAA a)
1052 {
\ test:
\ 00000000 10B5 PUSH {R4,LR}
\ 00000002 041C MOV R4,R0
1053 //
1054 sys_trace("%04x", sizeof(a.uu));
\ 00000004 0121 MOV R1,#+0x1
\ 00000006 .... LDR R0,??DataTable65 ;; `?
<Constant "%04x"> `
\ 00000008 ........ _BLF sys_trace,sys_trace??rT
1055 sys_trace("%04x", a.uu);
\ 0000000C 211C MOV R1,R4
\ 0000000E .... LDR R0,??DataTable65 ;; `?
<Constant "%04x"> `
\ 00000010 ........ _BLF sys_trace,sys_trace??rT
1056 sys_trace("%04x", sizeof(a.uu));
\ 00000014 0121 MOV R1,#+0x1
\ 00000016 .... LDR R0,??DataTable65 ;; `?
<Constant "%04x"> `
\ 00000018 ........ _BLF sys_trace,sys_trace??rT
1057 //
1058 }
和
1051 void test(struct AAA a)
1052 {
\ test:
\ 00000000 01B5 PUSH {R0,LR}
1053 //
1054 sys_trace("%04x", sizeof(a.uu));
\ 00000002 0121 MOV R1,#+0x1
\ 00000004 .... LDR R0,??DataTable65 ;; `?
<Constant "%04x"> `
\ 00000006 ........ _BLF sys_trace,sys_trace??rT
1055 sys_trace("%04x", a.nn);
\ 0000000A 6846 MOV R0,SP
\ 0000000C 4178 LDRB R1,[R0, #+0x1]
\ 0000000E .... LDR R0,??DataTable65 ;; `?
<Constant "%04x"> `
\ 00000010 ........ _BLF sys_trace,sys_trace??rT
1056 sys_trace("%04x", sizeof(a.uu));
\ 00000014 0121 MOV R1,#+0x1
\ 00000016 .... LDR R0,??DataTable65 ;; `?
<Constant "%04x"> `
\ 00000018 ........ _BLF sys_trace,sys_trace??rT
1057 //
1058 }
1055 sys_trace("%04x", a.nn);
\ 0000000A 6846 MOV R0,SP
\ 0000000C 4178 LDRB R1,[R0, #+0x1]
\ 0000000E .... LDR R0,??DataTable65 ;; `?
<Constant "%04x"> `
\ 00000010 ........ _BLF sys_trace,sys_trace??rT
--------------------------------------------------------------------------------
----
1055 sys_trace("%04x", a.uu);
\ 0000000C 211C MOV R1,R4
\ 0000000E .... LDR R0,??DataTable65 ;; `?
<Constant "%04x"> `
\ 00000010 ........ _BLF sys_trace,sys_trace??rT
注意看加粗部分
如果test函数只用到了a.uu则sys_trace的第二参数(R1) LDR test的第一参数(R0)
如果test函数用到了a.nn则sys_trace的第二参数(R1) LDRB 操作
小弟用ARM没多久
今天干活的时候出现错误才找到这个问题
不知道哪位兄台可以指点一下
不甚感激~
发表时间:2006年11月14日10:02:22