……
}
如上程序
在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没多久
今天干活的时候出现错误才找到这个问题
不知道哪位兄台可以指点一下
不甚感激~