- 打卡等级:以坛为家II
- 打卡总天数:521
- 最近打卡:2025-05-09 05:40:06
荣誉版主
- 积分
- 1026
|
AI公司提供的AI32G12K128的USB例程的util.c文件里有一个函数:
WORD reverse2(WORD w)
{
WORD ret;
((BYTE *)&ret)[0] = ((BYTE *)&w)[1];
((BYTE *)&ret)[1] = ((BYTE *)&w)[0];
return ret;
}
编译后的汇编代码为:
29: WORD reverse2(WORD w)
0xFF1316 7A370021 MOV w(0x0021),WR6
30: {
31: WORD ret;
32:
33: ((BYTE *)&ret)[0] = ((BYTE *)&w)[1];
0xFF131A 7E340022 MOV WR6,#0x0022
0xFF131E 7E240000 MOV WR4,#0x0000
0xFF1322 7E1B30 MOV R3,@DR4
0xFF1325 7E340023 MOV WR6,#0x0023
0xFF1329 7E240000 MOV WR4,#0x0000
0xFF132D 7A1B30 MOV @DR4,R3
34: ((BYTE *)&ret)[1] = ((BYTE *)&w)[0];
35:
0xFF1330 7E340021 MOV WR6,#w(0x0021)
0xFF1334 7E240000 MOV WR4,#0x0000
0xFF1338 7E1B30 MOV R3,@DR4
0xFF133B 7E340024 MOV WR6,#0x0024
0xFF133F 7E240000 MOV WR4,#0x0000
0xFF1343 7A1B30 MOV @DR4,R3
36: return ret;
0xFF1346 7E370023 MOV WR6,0x0023
37: }
0xFF134A 22 RET
用汇编代码为:
RSEG ?PR?REVERSE2?UTIL
reverse2 PROC
; line 29: WORD reverse2(WORD w)
MOV WR4,WR6
MOV R6,R5
MOV R7,R4
RET
ENDP
然后将c文件替换为汇编代码文件,重新编译后,进入debug汇编界面,
在usb.c文件里找到调用reverse2(WORD w)函数处:
244: Setup.wLength = reverse2(Setup.wLength);
0xFF0D8C 7E37000E MOV WR6,0x000E
0xFF0D90 12153A LCALL reverse2(C:0x153A)
0xFF0D93 7A37000E MOV 0x000E,WR6
再找到reverse2(C:0x153A)处:
75: MOV WR4,WR6
0xFF153A 7D23 MOV WR4,WR6
76: MOV R6,R5
0xFF153C 7C65 MOV R6,R5
77: MOV R7,R4
0xFF153E 7C74 MOV R7,R4
78: RET
0xFF1540 22 RET
验证OK!
|
|