- int run(char* pszParam)
- {
- unsigned int dwAddr;
- int ret;
- if (etHex(pszParam, &dwAddr) < 0)
- {
- printf("Address error\n");
- return -1;
- }
- printf("Run from:0x%08x (Y/N):", dwAddr);
- ret = uart_getc();
- printf("\n");
- if (ret != 'Y')
- {
- return 0;
- }
-
- __asm__ __volatile__("blx %0"::"r"(dwAddr));
-
- return 0;
- }
- int GetHex(char* pszStr, unsigned int* pdwValue)
- {
- char* p = pszStr;
- unsigned int dwValue = 0;
- char c;
- char bGet;
- while(*p == ' ') p++;
- if ((*p == '0') && (*(p+1) == 'x')) p += 2;
- bGet = FALSE;
- while((c=*p) != '\0')
- {
- if (c >= '0' && c <= '9')
- {
- dwValue <<= 4;
- dwValue += c-'0';
- bGet = TRUE;
- }
- else if (c >= 'a' && c <= 'f')
- {
- dwValue <<= 4;
- dwValue += 0x0a + (c-'a');
- bGet = TRUE;
- }
- else if (c >= 'A' && c <= 'F')
- {
- dwValue <<= 4;
- dwValue += 0x0a + (c-'A');
- bGet = TRUE;
- }
- else
- {
- //printf("c=%d\n", c);
- break;
- }
- p++;
- }
- *pdwValue = dwValue;
-
- if (!bGet)
- {
- //printf("not get\n");
- return -1;
- }
- //printf("Hex:0x%08x\n", dwValue);
- return p-pszStr;
- }
一,
ARM指令BLX,利用该指令可以实现具体执行流的跳转,同时切换ARM的状态ARM->THUMB或者THUMB->ARM,取决于执行该指令之前ARM所处的状态。
二 应用实例,编写一盒小应用程序,让处理器根据你指定的地址来运行,
思考一下,其实很简单,在汇编里面其实就是利用跳转指令就可以实现:B, BX, BL等。
这里有完善的代码,需要的LOOK一下。
主要有两个函数:run机器辅助函数GetHex。
执行方法:run addr(H)ok.
阅读(3932) | 评论(0) | 转发(0) |