我不明白为什么C51编译器(在Keil中)将C源代码转换为以下汇编语言代码:(因为p是指向无符号字符的指针)

;   p++;
            ; SOURCE LINE # 216
    MOV     R3,pDisplay?253
    INC     pDisplay?253+02H
    MOV     A,pDisplay?253+02H
    MOV     R2,pDisplay?253+01H
    JNZ     ?C0090
    INC     pDisplay?253+01H

由于在程序的下一行中未使用R3R2
为什么编译器将这些行设置为MOV R3,pDisplay?253MOV R2,pDisplay?253+01H

最佳答案

欢迎使用1980年代8位目标处理器的“最新技术”代码生成。代码正在做的是在递增p之前“注意到p的值”。在周围的表达式中使用postincrement运算符时,这是必需的;并且没有被编译器的后续遍历优化。

尝试p += 1;,甚至尝试++p;。可能其中之一或两者都会生成更好的代码,因为没有“注意之前的值”语义会妨碍代码生成器的方式。

[顺便说一下,这就是我进入少数派的方式,在++i循环中使用for ()而不是更常见的i++。]

关于c - 为什么编译器将C程序汇编成这个?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51048926/

10-11 15:43