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