请教大神,*(u16 *)中右边的*号是什么意思?

2020-01-04 19:01发布

在STM32  FSMC配置里看到这样一句

*(u16 *) (Bank1_SRAM3_ADDR + WriteAddr) = *pBuffer++;

请问*(u16 *)中,u16后面的*号是什么意思?

网上找了好久,没找到相关资料
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
37条回答
AIDN
1楼-- · 2020-01-07 00:38
 精彩回答 2  元偷偷看……
XL_J
2楼-- · 2020-01-07 04:32
回复【18楼】xnliuxiwen
-----------------------------------------------------------------------
是的,函数名就是地址。C教材(谭浩强写的那本)上有说的,函数地址调用函数时,加不加前面那一个星号都可以,但是要注意函数指针和*、()的结合优先级,如(*pFun)()和*pFun()是不同的
void Test()
{
    ...
}

int main(void)
{
    void (*pFun)() = Test;

    (*pFun)();                  /* (*pFun)()和pFun()作用一样,都是实现Test()函数调用   */
     pFun();
}
XL_J
3楼-- · 2020-01-07 08:22
回复【18楼】xnliuxiwen
-----------------------------------------------------------------------

笔误 *( ( void(*)())0x0000 ) )();左边少加了一个左括号,
    (*( ( void(*)())0x0000 ) )();
  {加上左括号}
XL_J
4楼-- · 2020-01-07 08:40
这一段代码有意思(51单片机平台)
int main(void)
{
    unsigned char code Reset[]={0xE4,0xC0,0xE0,0xC0,0xE0,0x32};   /* 复位代码,属于机器码                  */

    (*((void (*)())(Reset)))();                                   /* 将Reset数组当函数调用                 */
}


(原文件名:s.jpg)

也就是数组中的数据是四条汇编指令
    CLR A
    PUSH ACC
    PUSH ACC
    RETI
的机器码,这样(*((void (*)())(Reset)))()就执行了(一般只对普林斯顿结构的MCU、PC、其他处理器有用—数据空间和程序空间地址统一编码)
    CLR A
    PUSH ACC
    PUSH ACC
    RETI
这样的操作。想想可不可做病毒,或者在外部存储器中(外部EEPROM、SD卡、U盘)存储一个文件,该文件就是特定程序的机器码,把这样的存储器插入到设备中时,处理器/单片机读入数据到内部SRAM,之后运行这个读入的程序
catx
5楼-- · 2020-01-07 14:31
回复【25楼】XL_J  
-----------------------------------------------------------------------

类似的技术用得很多
而且不限于嵌入式
比如软件反破_解的花指令
虚拟机字节码Just In Time优化的ASM emitter

而且其实你程序存储在媒体上
本身就是以这种形式
用Linux就知道
同样的文件
设置成可执行属性才会当做程序执行
不然就是数据。。。。
XL_J
6楼-- · 2020-01-07 17:35
 精彩回答 2  元偷偷看……

一周热门 更多>