// BUGBUG, because Media Player for Pocket PC sometimes pass us un-aligned buffer
// we have to waste cycle here to work around this problem
if( ((DWORD) pSectorBuff) & 0x3) {
RETAILMSG(1, (TEXT("(DWORD) pSectorBuff) & 0x3=true \r\n") ));
for(i=0; i<SECTOR_SIZE/sizeof(DWORD); i++) {
rddata = (DWORD) NF_DATA_R4();
pSectorBuff[i*4+0] = (BYTE)(rddata & 0xff);
pSectorBuff[i*4+1] = (BYTE)(rddata>>8 & 0xff);
pSectorBuff[i*4+2] = (BYTE)(rddata>>16 & 0xff);
pSectorBuff[i*4+3] = (BYTE)(rddata>>24 & 0xff);
}
}
else {
ReadPage512(pSectorBuff, pNFDATA);
}
其中,pSectorBuff是一个,字节指针,
当这个指针指向的地址,并不是一个4字节对齐的地址的时候, 程序就不采用汇编函数ReadPage512对pSectorBuff进行双字操作,如果是对齐的,就在汇编函数ReadPage512中采用双字对pSectorBuff进行操作
这样做的原因:
有一个汇编函数如下:
函数定义位:extern void __RdMy(char* d);
注意1:这个函数的 参数d,所指向的地址必须为4字节对齐的,否则,程序会崩溃。
注意2:这个函数并不是对d操作8个字节,而是操作了8*4个字节。
stmia 指令是 一种空升操作,就是说,r0所指向的地址是空的,可以存数据的。
函数数据的参数为0x30009E40,执行结果如下:
汇编函数ReadPage512,内容如下:
__RdMy
stmfd sp!,{r1-r11}
ldrb r3,=0x33
ldrb r4,=0x11
ldrb r5,=0x22
ldrb r6,=0x33
ldrb r7,=0x44
ldrb r8,=0x55
ldrb r9,=0x66
ldrb r10,=0x77
ldrb r11,=0x88
stmia r0!,{r4-r11}
ldmfd sp!,{r1-r11}
mov pc,lr