arm-none-eabi-gcc C指针

Ben*_*enE 3 c assembly gcc arm disassembly

所以在arm-none-eabi-gcc中使用C语言.我一直有指针问题,它们似乎不存在.也许我将错误的cmds传递给编译器.

这是一个例子.

    unsigned int * gpuPointer = GetGPU_Pointer(framebufferAddress);
    unsigned int color = 16;
    int y = 768;
    int x = 1024;

    while(y >= 0)
    {
        while(x >= 0)
        {
            *gpuPointer = color;
            color = color + 2;
            x--;
        }

        color++;
        y--;
        x = 1024;
    }
Run Code Online (Sandbox Code Playgroud)

以及反汇编程序的输出.

81c8:   ebffffc3    bl  80dc <GetGPU_Pointer>
81cc:   e3a0c010    mov ip, #16 ; 0x10
81d0:   e28c3b02    add r3, ip, #2048   ; 0x800
81d4:   e2833002    add r3, r3, #2  ; 0x2
81d8:   e1a03803    lsl r3, r3, #16
81dc:   e1a01823    lsr r1, r3, #16
81e0:   e1a0300c    mov r3, ip
81e4:   e1a02003    mov r2, r3
81e8:   e2833002    add r3, r3, #2  ; 0x2
81ec:   e1a03803    lsl r3, r3, #16
81f0:   e1a03823    lsr r3, r3, #16
81f4:   e1530001    cmp r3, r1
81f8:   1afffff9    bne 81e4 <setup_framebuffer+0x5c>
Run Code Online (Sandbox Code Playgroud)

不应该在81e4附近有一个str cmd吗?要进一步添加GetGPU_Pointer来自汇编程序文件,但是有一个声明.

extern unsigned int * GetGPU_Pointer(unsigned int framebufferAddress);
Run Code Online (Sandbox Code Playgroud)

我的直觉是它的荒谬简单,但我想念它.

ric*_*ici 7

你永远不会改变它的值,gpuPointer你没有声明它指向a volatile.因此,从编译器的角度来看,您将覆盖单个内存位置(*gpuPointer)768*1024次,但由于您从未使用您正在写入的值,因此编译器有权通过在循环结束时执行单次写入来进行优化.