salon 发表于 2009-10-30 11:02:44

请问asm("mov pc,%0" : : "r" (0x20008000));是怎么执行的

前几天看到一篇“更改boot,绕过UBOOT,直接启动LINUX”的文章,里面有这么一句asm("mov pc,%0" : : "r" (0x20008000)),不明白是怎么执行的,麻烦解释一下。
void boot() {
int i;
char* ptr=(char*)DST;
for(i=0;i<LEN;i++) ptr=0;
AT91F_DBGU_Printk ("Work-man\'s boot.\n\r");
/**************************************************************************/
//decompress_image(SRC,DST,LEN);
#if 0
void* memcpy(void* __dest, const void* __src, size_t __n)
{
int i;
char *d = (char *)__dest, *s = (char *)__src;

for (i=0;i<__n;i++) d = s;
}
#endif
   
/*memcpy(DST,SRC,LEN);*/
AT91F_DBGU_Printk("load the Kernel.\n\r");
   memcpy(0x20008000,start_Kernel,size_Kernel);
AT91F_DBGU_Printk("load the Ramdisk.\n\r");
   memcpy(0x20a00000,start_Ram,size_Ram);

/**************************************************************************/
AT91F_DBGU_Printk("Run the LINUX.\n\r");
   asm("mov pc,%0" : : "r" (0x20008000));       //原来DST改为0x20008000,此语句是跳到LINUX入口(0x20008000)开始执行。
};

xiaobao601 发表于 2009-11-10 15:17:18

%0指的就是r,而r的值是0x20008000,所以。。。
嵌入式汇编规定把输出和输入寄存器统一编号,顺序是从输出寄存器序列从左到右,从上到下以"%0"开始,分别即为%0,%1...

fsclub 发表于 2009-11-10 15:18:40

我看是不是把程序指针跳到0x20008000开始执行?
猜的。
页: [1]
查看完整版本: 请问asm("mov pc,%0" : : "r" (0x20008000));是怎么执行的