没学过C51,问了一下ChatGPT,回答如下。
你的代码看起来像是尝试在C51环境下通过函数指针调用内存中的机器码指令。这个代码崩溃的原因可能有以下几个方面:
1. **内存区域问题**:
你把指令放在了`lcall_mem`数组中,而该数组是放在数据存储区(data memory)中的。C51的数据存储区与代码存储区是分开的,直接在数据存储区执行代码是不可行的。
2. **函数指针类型**:
`far`关键字指定了函数指针指向的是代码存储区中的一个地址,但`lcall_mem`是一个数据存储区的地址,两者不匹配。
3. **编译器和硬件限制**:
一些编译器和硬件环境可能会对代码执行位置有严格的限制,不允许在数据存储区执行代码。
解决这个问题的一种方法是使用`code`存储类型来定义内存数组,确保数组被放置在代码存储区。修改后的代码如下:
unsigned char code lcall_mem[10];
void (code *lcall_code)();
void test()
{
// 注意: 你需要确保在C51编译器中使用指令将lcall_mem放到代码区
lcall_mem[0] = 0x22; // C51的RET指令机器代码
lcall_code = (void (code *)())lcall_mem;
lcall_code();
}
但是,这个代码仍然可能存在其他潜在问题:
- 编译器优化和内存分配:需要确保`lcall_mem`被分配到代码存储区的确切位置并且没有被编译器优化掉。
- 安全性和稳定性:直接执行内存中的指令是非常危险的操作,可能会导致不可预测的行为,尤其是在嵌入式系统中。
最后,还需要根据你的具体编译器和硬件手册,确认如何正确地在代码存储区放置和执行自定义机器码。某些系统可能有特定的机制或函数来处理这种情况。
【 在 moonwalker 的大作中提到: 】
: 如下,我打算用函数指针调用内存代码:
: U8 lcall_mem[10];
: void (far *lcall_code)();
: ...................
--
FROM 101.224.229.*