Bob*_*Bob 0 c embedded assembly gdb arm
假设您有一个指向函数的指针,该函数的源代码是您没有的,而且是"不可信的",因为它可能会读取/写入不允许的内存区域.
在执行每个汇编指令之前,您需要验证它是否不访问不允许的内存区域.
操作系统(几乎)是裸机,即自定义RTOS(因此没有Linux或QNX).
这适用于不仅需要在开发期间而且在正常运行时期间启用的功能.
理想情况下,它运行如下:
void (*fptr)(int);
fptr = &someFunction; // untrusted, don't have source
// enable interrupts for each assembly instruction
_EN_INT();
// call the function
fptr();
// everytime the PC increments, some other code runs which verifies that if any load/stores are executed, it doesn't access some disallowed memory range
// disable interrupts for each assembly instruction
_DIS_INT();
Run Code Online (Sandbox Code Playgroud)
题
是否可以在每个汇编指令后调用该函数并暂停执行?
操作系统(几乎)是裸机,即自定义RTOS(因此没有Linux或QNX).
我的回答是假设你可以按照你需要的方式修改"操作系统"......
Cortex MK20DX256VLH7
这似乎是一个Cortex M4 CPU.
如何在没有jtag,断点的情况下单步执行目标代码
从文档中,它没有说明您是否需要外部调试器来恢复执行.
如果CPU真的停止了,你肯定需要一个外部信号(例如来自调试器).
但是大多数CPU都支持软件调试.这意味着只要遇到断点就会执行中断服务程序.要继续执行,只需从中断服务程序返回.
我不知道Cortex M4,但对于Cortex M3,你必须设置一些特殊的寄存器来启用该功能.只要命中"BKPT"指令,就执行中断#12(*).
对于RAM中的代码,只需将BKPT指令(0xBExx,例如0xBEBE)写入要设置断点的地址即可.(在写之前,你会读出值,以便以后能够恢复它).
对于Flash代码中的M3具有"闪光修补单元",它允许你指定最多哪些应作为0xBExx读出三个地址(0xBEBE?)即使其他数据被存储在那里.这允许您在Flash中设置最多3个断点.
有意思:控制M3中调试功能的寄存器(名为"DEMCR")也有一个名为"MON_STEP"的位:
如果在中断处理程序#12中设置此位,则在从中断处理程序返回后只执行一条指令,并再次触发中断#12.这个功能的用例当然是单步代码!
要停止单步执行,您必须再次清除MON_STEP位...
重要1:
我不知道 MK20DX256VLH7是否真的具备所有这些功能.然而,因为它是一个Cortex M4芯片而且M4应该具有M3的几乎所有功能,所以这些功能应该存在......
重要2:
实现单步执行和调试并不是很快.汇编语言知识非常有用,你需要很多时间......
从文档中,......
您不仅需要恩智浦MK20DX256VLH7的文档,还需要ARM提供的Cortex M4文档.
(*)向量表中的偏移量4*12在这里(在某些ARM文档中称为"IRQ(-4)"); 不是IRQ12.