如何更好地从指向地址的地址读取值

时间:2011-06-25 23:17:54

标签: c memory pointers embedded sdcc

我想知道是否有更好的方法来写这个:

void readtcp_c(unsigned char c)
{
    volatile char *a;
    volatile int *p;
    volatile int *q;

    a = (char *)APPLE_REG_A;    // a = memory mapped address for REG A
    *a = c + 128;               // store c + 128 in REG A

    p = (int *)APPLE_SUB;       // p = address of 6502 sub
    *p = TCP_WRITE;             // store TCP entry point in address p

    p = (int *)SOFTCARD;        // p = address of softcard address
    q = (int *)*p;              // q = softcard address
    *q = 0;                     // write 0 to softcard address
}

IANS,我必须读/写特定的地址。 'a'只是对存储器映射寄存器的写入(6502)。接下来的两行是相似的,除了我正在编写6502入口点的地址以供稍后使用。最后3行是我必须将0写入存储在SOFTCARD中的地址。写入此地址会触发对上述入口点的调用。

这是我认为可以缩短的最后3行。也许不是。如果其他对可以写成单行,那也很棒。代码工作和编译(sdcc)没有错误或警告。

感谢。

更新:我想我可以替换:

    p = (int *)SOFTCARD;            // p = address of softcard address
    q = (int *)*p;                  // q = softcard address
    *q = 0;                         // write 0 to softcard address

使用:

    p = (int *)*(int *)SOFTCARD;
    *p = 0;

它在没有警告的情况下编译并运行。但它可读吗?再次感谢。

2 个答案:

答案 0 :(得分:1)

这应该这样做。在添加volatile(以及一对括号)

之后,我只是按照定义替换了变量
void readtcp_c(unsigned char c)
{
    *((volatile char *)APPLE_REG_A) = c + 128;
    *((volatile int *)APPLE_SUB) = TCP_WRITE;
    *((volatile int *)*((volatile int *)SOFTCARD)) = 0;
}

编译器完全能够从您的第一个版本生成良好的代码。我更喜欢你的分步代码。

答案 1 :(得分:0)

您应该能够将所有作业重写为

*(char *)APPLE_REG_A = c + 128;
*(int *)APPLE_SUB = TCP_WRITE;
**(int **)SOFTCARD = 0;