现在的位置: 首页 > 综合 > 正文

字节对齐问题的另一种表现–使用汇编

2013年06月20日 ⁄ 综合 ⁄ 共 1071字 ⁄ 字号 评论关闭

  //  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

 

 

 

抱歉!评论已关闭.